[python] 플라이웨이트 패턴
플라이웨이트 패턴은 객체를 공유하여 메모리를 절약하고 성능을 향상시킬 수 있는 디자인 패턴입니다. 이 패턴은 많은 수의 유사한 객체를 생성하는 경우 유용합니다. 플라이웨이트 객체는 내부 상태를 가지지 않으며 공유 가능한 상태를 가지고 있습니다.
구조
플라이웨이트 패턴은 다음과 같은 구조로 이루어집니다:
- FlyweightFactory: 플라이웨이트 객체를 생성하고 관리하는 팩토리 클래스입니다. 객체의 공유를 관리하며, 요청에 따라 새로운 객체를 생성하거나 기존 객체를 반환합니다.
- Flyweight: 실제 객체를 나타내는 인터페이스입니다. 플라이웨이트 객체는 내부 상태를 가지지 않으므로, 메서드의 인자로 외부 상태를 전달받아 동작합니다. 즉, 객체의 동작은 외부에서 전달되는 정보에 의해 결정됩니다.
- ConcreteFlyweight: 플라이웨이트 객체의 구체적인 구현체입니다. 내부 상태를 가질 수 없으므로, 외부에서 전달되는 정보에 따라 동작합니다.
예제
아래는 플라이웨이트 패턴을 사용하여 문자열 객체를 공유하는 예제 코드입니다.
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
는 이미 생성된 플라이웨이트 객체를 관리하여 중복 생성을 방지합니다.
요약
플라이웨이트 패턴은 많은 수의 유사한 객체를 생성할 때 메모리를 절약하고 성능을 향상시킬 수 있는 패턴입니다. 객체의 내부 상태 대신 외부에서 전달되는 정보에 의해 동작하므로, 공유 객체의 상태 변경은 원치 않는 예기치 않은 결과를 초래할 수 있으므로 주의해야 합니다.