- 지난 글에 이어 생성패턴을 다뤄본다.
추상 팩토리 (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 |