Search Results for '디자인 패턴/4. 원형( Prototype )'

1 POSTS

  1. 2012.10.22 원형( Prototype )

원형( Prototype )

Posted 2012. 10. 22. 17:38

프로토타입 패턴?

객체에 의해 생성될 객체의 타입이 결정되는 생성 디자인 패턴.

이 패턴은 새로운 객체를 생성하기 위해 clone(복제)를 이용 한다.

클라app에서 객체 생성자의 서브 클래싱을 피한다.(추상팩토리는 객체 생성자를 서브클래싱해야한다)

주어진 app에서 일반적인 방법( new 키워드를 이용한 방법)으로 객체를 생성할 때에 필요한 비용이

엄청난 경우에 이 비용을 없앨 수 있다.


이 패턴을 구현하기 위해 순수가상 clone()메서드를 가지는 추상 클래스를 선언한다.

다형적인 생성자( polymorphic constructor )가 필요한 어떤 클래스든지 추상 클래스를 상속받아서

clone()메서드를 구현 해야 한다.( 원형 객체를 생선하는 초기화 동작이 꼭 필요하다)

클라는 new 연산자와 클래스 이름을 같이 쓰기보다 프로토타입 객체의 clone()메서드를 호출 하거나

팩토리에 원하는 클래스에 해당하는 인자를 넣어서 호출하거나, 다른 디자인 패턴에 의해 제공 되는

어떤 매커니즘을 통해 clone()메서드를 호출 할 수도 있다.


사용 예)

제품의 생성, 복합, 표현 방법에 독립적인 제품을 만들고자 할때.

어떤 클래스의 인스턴스를 만드는 것이 자원/시간을 많이 잡아먹거나 복잡 할 때.

모두 클래스로 만들기에 종류가 너무 많을때

인스턴스 생성이 어려운 경우( 인스턴스화할 클래스를 런타임에 지정할때, 동적 로딩)


구조.


약간의 설정 변경으로 비슷하지만 다른 클래스로의 확장이 가능한 경우, 세부 클래스를 미리 명세하지 않고 런타임에 원형을 복제해서 그 복사본을 수정함으로써 동적 클래스 생성을 가능케 하는 패턴이다.


원형 패턴과 추상 팩토리 패턴은 어떤 면에선 경쟁적인 관계다. 하지만 함께 사용 할 수도 있다.



// Prototype

class Prototype

{

public:

virtual ~Prototype() {}

virtual Prototype* clone() const = 0;

};


// Concreate Prototype

class ConcreatePrototype : public Prototype

{

public:

ConcreatePrototype( int x ) : x_(x) {}

ConcreatePrototype( const CroncreatePrototype& p) : x_(p.x_){}

virtual Prototype* clone() const{ return new ConcreatePrototype(*this); }

void setX( int x ) { x_ = x; }

int getX() const { return x_; }

void printX() const{ std::cout<< "Value : " << x_ << std::endl; }

private:

int x_;

};


// client

void main()

{

Prototype* prototype = new ConcreatePrototype(1000);

for( int i = 1 ; i < 10 ; i++ )

{

CreatePrototype* tempotype =

dynamin_case<ConcreatePrototype*>(prototype->clone());

tempotype->setX(tempotype->getX() * i );

tempotype->printX();

delete tempotype;

}

delete prototype;

}


-> valuie : 1000

-> value : 2000

-> value : 3000

..

..

..

-> value : 9000