소프트웨어 개발자/디자인패턴

[디자인패턴] 생성 패턴 - Prototype 패턴

yubi5050 2024. 3. 31. 21:03

생성 (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 함수로 생성

 

 

장단점

장점

  • 미리 빌드된 프로토타입을 복제하기 위해 반복되는 초기화 코드를 제거 가능
  • 복잡한 개체에 대한 구성 사전 설정을 처리, 복잡한 객체를 보다 편리하게 제작할 수 있습니다.

단점

  • 단점 : '순환 참조가 있는 복잡한 개체'를 복제하는 것은 까다로울 수 있음

 

다른 패턴과의 관계

일반적으로 많은 생성 패턴의 흐름은 팩토리 메서드 (덜 복잡하고 서브클래스를 통해 사용자 정의 가능한) 에서 시작해 => Abstract Factory, Prototype, Builder (더 유연하지만 더 복잡함) 로 발전됨

 

at 추상 팩토리 클래스

  • 추상 팩토리 클래스에서 이러한 니즈 수행이 팩토리 메소드로도  가능하지만 프로토타입을 사용해서도 구성 가능

 

with Command 

  • Prototype은 Command 패턴을 기록에 저장해야 할 때 도움이 될 수 있다.

 

with Composite, Decorator

  • Composite 와 Decorator 를 많이 사용하는 디자인은 Prototype을 사용하면 종종 이점을 얻을 수 있음
  • 해당 패턴을 적용하면 처음부터 다시 구성하는 대신 복잡한 구조를 복제하여 사용 가능

 

vs Memento 

  • Prototype이 Memento 보다 더 간단한 대안이 될 수도 있음

 

at 싱글톤

  • 추상 팩토리, 빌더  프로토타입은 모두 싱글톤 으로 구현될  있음