프로토타입 패턴이란?
클래스부터 인스턴스를 새로 만드는게 아닌,
인스턴트를 복사해서 새로운 인스턴스를 만드는 것이다!
객체로부터 객체 생성
왜 인스턴스를 복제하지요?
1. 종류가 너무 많아서 클래스로 정리불가
2. 클래스로부터 인스턴스 생성이 어려움
ex) 사용자가 마우스로 그린 도형을 나타내는 인스턴스: 똑같이 그리는거 힘듦
3. 인스턴스 생성 프레임워크를 특정 클래스에 의존하지 않게 하고 싶을 경우 (예제)
java에는 clone이라는 기능을 제공하고 있음. <- Clonable 인터페이스를 구현한 class에 한하

manager class (client)에 messageBox 객체와 UnderlinePen 객체를 등록한 후 -> prototype
두 객체의 복제품을 얻어가는 형식
public class Manager {
private Map<String,Product> showcase = new HashMap<>();
public void register(String name, Product prototype) {
showcase.put(name, prototype);
}
public Product create(String prototypeName) {
Product p = showcase.get(prototypeName);
return p.createCopy();
}
}
showcase
객체 유형을 저장하는 객체
HashMap<>형태로 key,value값을 저장한다.
create: 프로토타입의 이름(key)를 입력받아, value(객체)를 찾고, 객체를 복제해서 반환함.
public class UnderlinePen implements Product {
private char ulchar;
public UnderlinePen(char ulchar) {
this.ulchar = ulchar;
}
public void use(String s) {
int ulen = s.length();
System.out.println(s);
for (int i = 0; i < ulen; i++) {
System.out.print(ulchar);
}
System.out.println();
}
public Product createCopy() {
Product p = null;
try {
p = (Product)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
createCopy: 지역변수 p 를 상위 class로 초기화 -> 객체 복제 후 지역변수 p에 저장
꼭 예외처리를 해줘야한다!!
메소드변수 p는 Product type인데, 변수의 타입이 꼭 Clonable 인터페이스를 구현해야한다.
예외처리 안해주면 프로그램 터짐~~!
+ clone() 메소드는 Clonable인터페이스가 아닌, java.lang.Object에 정의되어있으므로,
모든 class에서 clone 메소드를 상속하고 있다!
+ clone()은 깊은복사x 얕은복사o
즉, 메모리를 그대로 복사하는것이 아닌, 값만 복사함!
그러므로 같은 메모리 주솟값을 가짐.
깊은복사는 메모리를 그대로 복사하므로 메모리주소가 서로 다른 독립적인 관계를 가짐.
'복습 > 소프트웨어디자인패턴' 카테고리의 다른 글
| Bridge 패턴 (0) | 2026.04.17 |
|---|---|
| Singleton 패턴 (0) | 2026.04.17 |
| Factory Method 패턴 (1) | 2026.04.17 |
| Template Method 패턴 (0) | 2026.04.17 |
| Adapter 패턴 (0) | 2026.04.17 |