생성 (Creational) 패턴
다양한 상황에서의 객체의 생성 방식을 결정하는 디자인 패턴
주요 패턴으론 다음 사항들이 있다.
- 팩토리 메서드 (Factory Method)
- 추상 팩토리 (Abstract Factory)
- 빌더(Builder)
- 싱글톤(SingleTon)
- 프로토타입(Prototype) <- 이번 글에서 다룰 내용
- 템플릿메서드(TemplateMethod)
프로토 타입 패턴 이란?
- 생성 패턴의 한 방법으로, 객체를 생성할 때 클래스를 이용하여 새로운 객체를 생성하는 것이 아닌, 기본 템플릿(이미 존재하는 객체)을 복제하여 생성하는 디자인 패턴
- 주로 객체를 생성하는데 비용이 큰데, 이를 빈번하게 생성해야 하는 경우 주로 사용됨
- 사실 Python에서는 이미 deepcopy() 로 대체가능함.
왜 사용하는가?
만약 똑같은 A1 객체, A2 객체를 만든 다고 할 때,
A라는 공통의 부모 클래스를 상속 받아, 생성자를 통해 구현하는 것도 가능하다.
하지만 만약 필드가 굉장히 많다면 생성자를 통한 초기화 작업은 굉장히 번거로운 일이 될 것이다.
따라서 A1 객체를 복제해 A2 객체로 만들면 생성 비용이 적게 든다.
의사코드
다음의 관계를 가진 클래스 선언에서, Prototype 패턴을 이용해 Circle 객체를 여러개 만드는 의사 코드는 다음과 같다.
- Shape 부모 클래스의 생성자와 clone() 함수를 interface로 선언
- Circle 클래스의 부모 클래스의 생성자 호출 및 clone() 함수로 Prototype 패턴 선언
- 클라이언트 코드에서는 Circle 객체 생성 후 anotherCircle 생성시 Circle 객체의 clone 함수로 생성
코드
import copy
class SthPrototype:
def __init__(self, value):
self.value = value
def clone(self):
# 복제 방식 정의 (필요시 커스터마이징)
return copy.deepcopy(self)
# 클라이언트 코드
obj1 = SthPrototype([1])
obj1.value.append(2)
obj1.value.append(3)
# obj2 = Prototype(...) # 클래스를 이용한 재생성 후 append 반복..
obj2 = obj1.clone() # 프로토타입 복제
obj2.value.append(4)
print(obj1.value) # [1, 2, 3]
print(obj2.value) # [1, 2, 3, 4] (서로 독립적인 객체)
장단점
장점
- 미리 빌드된 프로토타입을 복제하기 위해 반복되는 초기화 코드를 제거 가능
- 복잡한 개체에 대한 구성 사전 설정을 처리, 복잡한 객체를 보다 편리하게 제작할 수 있습니다.
단점
- 단점 : '순환 참조가 있는 복잡한 개체'를 복제하는 것은 까다로울 수 있음
다른 패턴과의 관계
일반적으로 많은 생성 패턴의 흐름은 팩토리 메서드 (덜 복잡하고 서브클래스를 통해 사용자 정의 가능한) 에서 시작해 => Abstract Factory, Prototype, Builder (더 유연하지만 더 복잡함) 로 발전됨
at 추상 팩토리 클래스
- 추상 팩토리 클래스에서 이러한 니즈 수행이 팩토리 메소드로도 가능하지만 프로토타입을 사용해서도 구성 가능
with Command
- Prototype은 Command 패턴을 기록에 저장해야 할 때 도움이 될 수 있다.
with Composite, Decorator
- Composite 와 Decorator 를 많이 사용하는 디자인은 Prototype을 사용하면 종종 이점을 얻을 수 있음
- 해당 패턴을 적용하면 처음부터 다시 구성하는 대신 복잡한 구조를 복제하여 사용 가능
vs Memento
- Prototype이 Memento 보다 더 간단한 대안이 될 수도 있음
at 싱글톤
- 추상 팩토리, 빌더 및 프로토타입은 모두 싱글톤 으로 구현될 수 있음
'소프트웨어 개발자 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 행동 패턴 - Command 패턴 (0) | 2024.05.01 |
---|---|
[디자인패턴] 행동 패턴 - 옵저버 패턴 (2) | 2024.05.01 |
[디자인패턴] 생성 패턴 - 싱글톤 (Singleton) 패턴 (1) | 2024.03.30 |
[디자인패턴] 생성 패턴 - 빌더 (Builder) 패턴 (0) | 2024.03.30 |
[디자인패턴] 생성 패턴 - 팩토리 (Factory) 패턴 (1) | 2024.03.30 |