[python] 플라이웨이트 패턴

플라이웨이트 패턴은 객체를 공유하여 메모리를 절약하고 성능을 향상시킬 수 있는 디자인 패턴입니다. 이 패턴은 많은 수의 유사한 객체를 생성하는 경우 유용합니다. 플라이웨이트 객체는 내부 상태를 가지지 않으며 공유 가능한 상태를 가지고 있습니다.

구조

플라이웨이트 패턴은 다음과 같은 구조로 이루어집니다:

예제

아래는 플라이웨이트 패턴을 사용하여 문자열 객체를 공유하는 예제 코드입니다.

class Flyweight:
    def __init__(self, shared_state):
        self._shared_state = shared_state

    def operation(self, external_state):
        # 외부 상태와 내부 상태를 조합하여 동작 수행
        print(f"Shared state: {self._shared_state}, External state: {external_state}")


class FlyweightFactory:
    def __init__(self):
        self._flyweights = {}

    def get_flyweight(self, shared_state):
        if shared_state not in self._flyweights:
            self._flyweights[shared_state] = Flyweight(shared_state)
        return self._flyweights[shared_state]


if __name__ == '__main__':
    factory = FlyweightFactory()
    flyweight1 = factory.get_flyweight("A")
    flyweight2 = factory.get_flyweight("A")

    flyweight1.operation("B")
    flyweight2.operation("C")

위 예제에서는 FlyweightFactory 클래스가 플라이웨이트 객체를 생성하고 관리합니다. Flyweight 클래스는 실제 문자열 동작을 수행하는 객체를 나타내며, shared_state라는 공유 가능한 상태를 가지고 있습니다. FlyweightFactory는 이미 생성된 플라이웨이트 객체를 관리하여 중복 생성을 방지합니다.

요약

플라이웨이트 패턴은 많은 수의 유사한 객체를 생성할 때 메모리를 절약하고 성능을 향상시킬 수 있는 패턴입니다. 객체의 내부 상태 대신 외부에서 전달되는 정보에 의해 동작하므로, 공유 객체의 상태 변경은 원치 않는 예기치 않은 결과를 초래할 수 있으므로 주의해야 합니다.