프런트엔드/디자인 패턴

[6일차] 플라이웨이트 | 구조 패턴 7일만에 끝내기 챌린지 - GoF 디자인 패턴

조드래곤나인 2023. 7. 16. 14:54

 

출처: 에릭 감마 , 리처드 헬름 , 랄프 존슨 , 존 블리시디스. 『Gof의 디자인 패턴』. 김정아(역). 프로텍미디어, 2015.

 

 

[6일차] 플라이웨이트(Flyweight)
구조 패턴 7일만에 끝내기 챌린지 - GoF 디자인 패턴

타입스크립트로 설명하는 GoF 디자인 패턴의 구조 패턴 7일만에 끝내기 챌린지

 

 

플라이웨이트란?

공유를 통해 많은 수의 소립 객체들을 효과적으로 지원한다.

Flyweight 패턴에서 중요한 개념

본질적 상태와 부가적 상태의 구분이다.

본질적 상태는 Flyweight객체에 저장되어야 하며,

이것이 적용되는 상황과 상관없는 본질적 특성 정보들이 객체를 구성한다.

 

본질적이지 않는 부가적 상태는

Flyweight객체가 사용된 상황에 따라 달라질 수 있고,

그 상황에 종속적이므로 공유될 수 없다.

 

 

활용성

1) 응용프로그램이 대량의 객체를 사용해야 할 때
2) 객체의 수가 너무 많아져 저장 비용이 너무 높아질때

 

 

구조 및 구현

interface Flyweight {
    state: string
    operation(state: string): void
}

class ConcreteFlyweight implements Flyweight {
    state!: string
    operation(state: string) {
        this.state = state
    }
}

class UnshareConcreteFlyweight implements Flyweight {
    state!: string
    operation(state: string) {
        this.state = state
    }
}

class FlyweightFactory {
    flyweights: Map<string, Flyweight> = new Map()

    getFlyweight(key: string): Flyweight {
        const flyweight = this.flyweights.get(key)
        if (flyweight) {
            return flyweight
        } else {
            const newFlyweight = new ConcreteFlyweight()
            this.flyweights.set(key, newFlyweight)
            return newFlyweight
        }
    }
}
 
class Main {
    constructor() {
        const flyweightFactory = new FlyweightFactory()
        const unsharedFlyweight = new UnshareConcreteFlyweight()
        const concreteFlyweight1 = flyweightFactory.getFlyweight('something')
        const concreteFlyweight2 = flyweightFactory.getFlyweight('something')

        console.log(concreteFlyweight1 === concreteFlyweight2) // true
    }
}
 

Flyweight객체가 기능을 수행하는 데 필요한 상태가
본질적인 것인지 부가적인것인지를 구분해야 한다.
본질적인 상태는 ConcreteFlyweight에 저장해야 한다.
부가적인 상태는 사용자가 저장하거나,
연산되어야 하는 다른 상태로 관리 해야 한다.

 

사용자는 연산을 호출할 때 자신에게만 필요한 부가적 상태를

Flyweight 객체에 매개변수로 전달한다.

사용자는 ConcreteFlyweight의 인스턴스를 직접 만들 수 없다.

사용자는 ConcreteFlyweight객체를 FlyweightFactory객체에서 얻어야 한다.

이렇게 해야 Flyweight객체가 공유될 수 있다.

 


 

 

공식 기술블로그 링크

 

728x90