- 지난 글에 이어 생성패턴을 다뤄본다.
추상 팩토리 (Abstract Factory)
빌더 (Builder)
팩토리 메서드 (Factory Methods)
프로토타입 (Prototype)
싱글턴 (Singleton)
프로토타입 (Prototype)
- 의도
생성할 객체의 원형(prototpye)을 만들고, 이렇게 만든 견본을 복사하여 새로운 객체 생성
- 동기
원형이 되는 클래스를 생성하고, 해당 클래스의 객체를 복제하여 새로운 객체를 만들어나가는 패턴이다. 클래스를 동일하게 유지하면서 내부의 값이나 구조를 바꿔가며 새로운 객체를 만들 수 있기 때문에 클래스의 개수를 줄일 수 있다.
- 활용성
제품의 생성, 복합, 표현 방법에 독립적인 제품을 만들고자 할 때 쓰인다.
- 인스턴스화할 클래스를 런타임에 지정할 때 (동적로딩)
- 제품 클래스 계통과 병렬적으로 만드는 팩토리 클래스를 피할 때
- 서로 다른 상태 조합이 필요한 경우 (원형으로 조합을 초기화 해둔 뒤, 나중에 이를 복제해서 매번 필요한 상태 조합의 값들을 수동적으로 초기화)
- 구조

- 참여자
- Prototype: 자신을 복제하는 필요한 인터페이스를 정의
- Concrete Prototype: 자신을 복제하는 연산을 구현
- Client: 원형에 자기 자신의 복제를 요청하여 새로운 객체를 생성
- 결과
- 런타임에 새로운 제품을 추가/삭제
- 구조/값들을 다양화함으로써 새로운 객체 명세
- 서브클래스의 수 감소
- 동적으로 클래스에 따라 응용프로그램으로 설정 가능
원형 패턴 사용시 신경써야할 포인트는 원형의 서브클래스가 Clone() 연산을 구현해야 한다.
- 구현
- 원형 관리자 사용
- Clone() 연산 구현
- Clone() 초기화 (Initialize() 등)
- 예제
Car.java (Prototype)
public abstract class Car implements Cloneable { public abstract void printInfo(); @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
Tesla.java (ConcretePrototype)
public class Tesla extends Car { @Override public void printInfo() { System.out.println("Tesla!!!"); } }
Tucson.java (ConcretePrototype)
public class Tucson extends Car { @Override public void printInfo() { System.out.println("Tucson!!!"); } }
Main.java (Client)
public class Main { public static void main(String[] args) throws CloneNotSupportedException { Tesla tesla = new Tesla(); Tesla tesla1 = (Tesla) tesla.clone(); tesla1.printInfo(); Tesla tesla2 = (Tesla) tesla.clone(); tesla2.printInfo(); Tucson tucson = new Tucson(); Tucson tucson1 = (Tucson) tucson.clone(); tucson1.printInfo(); Tucson tucson2 = (Tucson) tucson.clone(); tucson2.printInfo(); } } // 실행결과 // // Tesla!!! // Tesla!!! // Tucson!!! // Tucson!!!
- 참고 문헌
- GoF의 디자인 패턴(개정판) / 에릭 감마, 리처드 헬름, 랄프 존슨, 존 블라시디스 공저 / 김정아 역 / 프로텍미디어 / 발행 2015년 03월 26일
'theory > 디자인패턴' 카테고리의 다른 글
GoF의 디자인 패턴. 생성패턴 5. 싱글턴 (0) | 2021.09.11 |
---|---|
GoF의 디자인 패턴. 생성패턴 3. 팩토리 메서드 (0) | 2021.08.22 |
GoF의 디자인 패턴. 생성패턴 2.빌더 (0) | 2021.08.15 |
GoF의 디자인 패턴. 생성패턴 1.추상 팩토리 (0) | 2021.08.08 |
GoF의 디자인 패턴. 서론 (0) | 2021.08.01 |