티스토리 뷰

프로토타입 패턴이란?

프로토타입 패턴은 객체 생성 비용이 높을 때 주로 사용되는데 새 객체를 생성할 때 원형이 되는 인스턴스를 복제하여 생성하는 패턴이다. 원본 객체를 새로운 객체에 복사하고, 수정할 수 있도록 한다. 이때, 복사된 새로운 객체가 수정되더라도 원본 객체는 수정이 되지 않아야 한다. 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) 간의 차이를 잘 이해하고 적용해야 한다. 얕은 복사가 아닌 깊은 복사를 해야 한다.
  • 순환 참조가 있는 복잡한 객체들을 복제하는 것은 매우 까다로울 수 있다.