디자인 패턴 중 Prototype 패턴에 대해 설명합니다.
개념
이미 존재하는 객체를 복사하는 생성패턴입니다. 외부에서 접근할 수 없는 속성이 존재하거나 추가적인 의존성 없이도 외부에서 객체를 복사하고 싶을 때 사용합니다. 다음과 같은 장점이 있습니다.
- Single Responsibility Principle: 객체 복사 프로세스를 해당 객체에게 위임하여 비즈니스 로직의 과도한 책임을 분산합니다.
- Dependency Inversion Principle: 구체적인 구현 객체에 의존하지 않고 인터페이스에 의존하여 객체를 복사할 수 있습니다.
- 객체 생성 시 복잡하거나 고비용의 구성이 필요한 경우 객체 복사로 대체할 수 있습니다.
- 외부에서 접근이 어려운 속성도 접근하여 복사합니다.
자세히 살펴보겠습니다.
Prototype
인터페이스를 정의하여 복사를 지원할 클래스에 clone 메소드를 구현하도록 강제합니다.
ConcretePrototype
clone 메소드에서 ConcretePrototype의 생성자를 호출하도록 합니다. 이때 생성자는 오버로딩을 해야 합니다. 생성자 호출 시 ConcretePrototype이 파라미터로 전달된 경우 해당 객체의 모든 속성값을 가져와 새로운 객체를 생성하도록 합니다.
SubclassPrototype
서브클래스의 경우 상위 클래스의 clone 메소드를 호출한 후에 자신의 생성자 호출을 수행하여 상위 클래스의 속성을 모두 복사하도록 합니다.
Client
복사하고자하는 객체의 clone 메소드를 호출하면 새로운 객체로 복사가 됩니다.
Ptorotype Registry
만약 반복적으로 사용되는 Prototype이 존재한다면 Prototype Registry를 통해 저장했다가 필요할 때마다 꺼내서 사용할 수 있습니다.
Client는 Prototype Registry를 통해 prototype을 찾고 해당 prototype을 복사합니다.
적용예시
그래픽 소프트웨어를 개발중이라고 가정합니다.
위의 이미지처럼 개체를 복사하는 기능을 추가하려고 할 때 Prototype 패턴을 적용할 수 있습니다.
오버로딩을 사용하는 구현과 오버로딩을 사용하지 않는 구현이 있습니다. 코드 예제는 파이썬 코드이고 파이썬은 오버로딩을 지원하지 않습니다. 그래서 오버로딩을 사용하지 않는 구현으로 예제를 작성하였습니다.
class Shape(abc.ABC):
@abc.abstractmethod
def clone(self) -> "Shape": ...
class Rectangle(Shape):
def __init__(self, width: int, height: int) -> None:
self.width = width
self.height = height
def clone(self) -> Shape:
return Rectangle(self.width, self.height)
rectangle = Rectangle(1, 5)
new_rectangle = rectangle.clone()
클라이언트 코드는 Rectangle clone 메소드를 통해 기존 객체를 복사할 수 있습니다.
참조
'객체 지향 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - Adapter (0) | 2023.10.12 |
---|---|
디자인 패턴 - Singleton (0) | 2023.10.11 |
디자인 패턴 - Builder (0) | 2023.10.09 |
디자인 패턴 - Abstact Factory (0) | 2023.10.05 |
디자인 패턴 - Factory Method (0) | 2023.10.03 |