프로토타입 패턴이란?
프로토타입 패턴은 객체 생성 비용이 높을 때 주로 사용되는데 새 객체를 생성할 때 원형이 되는 인스턴스를 복제하여 생성하는 패턴이다. 원본 객체를 새로운 객체에 복사하고, 수정할 수 있도록 한다. 이때, 복사된 새로운 객체가 수정되더라도 원본 객체는 수정이 되지 않아야 한다. Java에서는 clone() 메서드를 이용해 객체를 복제할 수 있으며, 이는 Cloneable 인터페이스를 구현하는 클래스에서 가능하다.
프로토타입 패턴 사용 법
- Prototype: 복제될 객체의 원형을 정의하는 인터페이스. 이 인터페이스는 자신의 복사본을 만드는 clone() 메서드를 포함
- Concrete Prototype: Prototype 인터페이스를 구현하고 자신의 복사본을 생성할 수 있는 실제 클래스
- Client: 프로토타입 인스턴스를 복제하여 새로운 인스턴스를 생성하는 클라이언트 역할을 한다.
//Prototype 인터페이스
interface Prototype{
Prototype clone();
}
//Prototype 인터페이스를 구현하는 객체로 새 객체를 만들기 위해 복제되는 객체
class ConcretePrototype implements Prototype{
private String name;
public ConcretePrototype(String name){
this.name=name;
}
public Prototype clone(){
return new ConcretePrototype(field1);
}
public void setName(String name){
this.name=name;
}
public void getName(){
return name;
}
}
class PrototypeClient {
public static void main(String[] args){
ConcretePrototype prototype=new ConcretePrototype("Original Object");
ConcretePrototype clone=(ConcretePrototype)prototype.clone();
clone.setName("Clone Object");
System.out.println("Original Object: "+prototye.getName());
System.out.println("Clone Object:"+clone.getName());
}
}
-> 클라이언트는 원본 객체를 수정해도 복제된 객체에 영향을 미치지 않는다!! 이는 프로토타입 패턴이 객체의 독립적인 복제를 지원함을 보여준다.
패턴 사용 시기
- 비용이 많이 드는 객체 초기화를 피하고 싶을 때
- 런타임에 새로운 객체를 동적으로 추가하고 싶을 때
- 클라이언트 코드가 생성할 객체의 구체적인 정보를 알지 못할 때
패턴 장점
- 객체를 처음부터 생성하기 복잡하고 시간이 많이 소요될 때, 이미 만들어진 객체를 복제함으로써 이 과정을 간소화
- 런타임에 새로운 객체 유형을 손쉽게 추가할 수 있다. 기존 코드를 변경하지 않고도 새로운 클래스 인스턴스를 생성할 수 있다.
- 클라이언트 코드는 원형 객체의 구체적인 클래스를 몰라도 된다. 객체를 복제하는 인터페이스만 알고 있으면, 그 인터페이스를 구현하는 모든 클래스의 객체를 복제할 수 있다.
패턴 단점
- 객체가 자기 자신을 복제할 수 있어야 하므로, 복제 로직을 적절히 관리해야 한다. 복잡한 객체 그래프를 가진 경우, 깊은 복사(deep copy)와 얕은 복사(shallow copy) 간의 차이를 잘 이해하고 적용해야 한다. 얕은 복사가 아닌 깊은 복사를 해야 한다.
- 순환 참조가 있는 복잡한 객체들을 복제하는 것은 매우 까다로울 수 있다.
'CS > Design Pattern' 카테고리의 다른 글
템플릿 메소드 패턴 (Template Method Pattern) (1) | 2024.06.09 |
---|---|
메멘토 패턴 (Memento Pattern) (0) | 2024.06.09 |
추상 팩토리 패턴 (Abstract Factory Pattern) (1) | 2024.06.09 |
팩토리 메소드 패턴 (Factory Method Pattern) (1) | 2024.06.09 |
빌더 패턴 (Builder Pattern) (1) | 2024.06.09 |