프로토타입(Prototype) 패턴
어떤 클래스의 인스턴스를 만들 때 자원과 시간이 많이 들거나 복잡하다면 프로토타입 패턴을 사용한다.
프로토타입 패턴은 객체를 생성하는 비용이 큰 경우, 기존 객체를 복사하여 새로운 객체를 생성하는 디자인 패턴 중 하나이다.
이는 객체를 생성하는 비용을 줄이고, 복잡한 초기화 과정을 반복하지 않고도 객체를 생성할 수 있게한다.
특징
시스템에서 복잡한 클래스 계층구조에 파묻혀 있는 다양한 형식의 객체 인스턴스를 새로 만들어야 할 때 유용하게 써먹을 수 있다.
- 복사를 통한 객체 생성
- 기존 객체를 복사하여 새로운 객체를 생성한다.
- 생성 비용 감소
- 비용이 큰 객체 생성을 피하고, 복사를 통해 새로운 객체를 빠르게 생성한다.
구조

- Prototype(프로토타입)
- ConcretePrototype(구체적인 프로토타입)
Prototype
인터페이스를 구현하고, 자신을 복사하여 새로운 객체를 생성하는 메서드를 구현한다.
- Client
- 프로토타입 객체를 복사하여 새로운 객체를 생성한다.
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| // Prototype
public interface Prototype {
Prototype clone();
}
// ConcretePrototype
public class ConcretePrototype implements Prototype {
private String data;
public ConcretePrototype(String data) {
this.data = data;
}
public void setData(String data) {
this.data = data;
}
public String getData() {
return data;
}
@Override
public Prototype clone() {
return new ConcretePrototype(this.data);
}
}
// Client
public class Client {
public static void main(String[] args) {
ConcretePrototype prototype = new ConcretePrototype("Original Data");
// 복사하여 새로운 객체 생성
ConcretePrototype clonedObject = (ConcretePrototype) prototype.clone();
// 원본과 복제본의 데이터 확인
System.out.println("Original Data: " + prototype.getData());
System.out.println("Cloned Data: " + clonedObject.getData());
// 복제본의 데이터 변경
clonedObject.setData("Modified Data");
// 원본과 복제본의 데이터 확인
System.out.println("Original Data: " + prototype.getData());
System.out.println("Cloned Data: " + clonedObject.getData());
}
}
|
장단점
장점
- 생성 비용 감소
- 비용이 큰 객체 생성을 피하고, 복사를 통해 빠르게 새로운 객체를 생성할 수 있다.
- 유연성 증가
- 객체의 생성 및 초기화 과정을 반복하지 않고, 복사를 통해 새로운 객체를 생성할 수 있어 유연성이 증가한다.
- 결합도 감소
- 클라이언트가 새로운 인스턴스를 만드는 과정을 몰라도 된다.
- 클라이언트는 구체적인 형식을 몰라도 객체를 생성할 수 있다.
단점
- 때로는 객체의 복사본을 만드는 일이 매우 복잡할 수도 있다.
- 깊은 복사 어려움
- 객체에 참조 타입 멤버 변수가 있는 경우, 이를 얕은 복사로 처리할 경우 문제가 발생할 수 있다.
clone
메서드의 구현 어려움clone
메서드를 구현하는 것이 쉽지 않을 수 있으며, 실수할 여지가 많다.