Search Results for '디자인 패턴/2. 빌더( Builder )'

1 POSTS

  1. 2012.10.22 빌더( Builder )

빌더( Builder )

Posted 2012. 10. 22. 16:39
복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여
서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 하는것.
하나의 소스객체에 복잡한 여러개의 객체를 만들 수 있도록 하는 패턴.

즉, 객체를 구성하는 부분을 먼저 생성하고, 이를 조합함으로써 전체 객체를 생성하기 때문에

생성 할 객체가 손 쉽게 추가 및 확장 가능하게 된다.



추상 팩토리와 비슷한데.

차이점이 빌더 패턴은 생성의 마지막 단계에 생성한 제품을 반환하는 반명,

추상 팩토리 패턴은 만드는 즉시 제품을 반환한다.

또, 빌더 패턴은 복잡한 객체의 단계별 생성에 중점을 둔 반면

추상 팩토리 패턴은 제품의 유사군들이 존재할 때 유연한 설계에 중점을 둔다.


추상팩토리는

공장 -> 생산 이라면

빌더는

공장 -> 메뉴 -> 생산 처럼

중간에 디렉터 라는 개념이 있다.

즉, 다양한 클래스로 생성 해야 할 것들을 하나의 클래스로 한번에 생성 하는것.


아 이거 설명 뭔가 허접한데.....

사용 예)

피자종류에 대한 프로그램을 짠다고 하면.

토핑과 막, 소스, 피클양, 페퍼로니,사이즈,치즈크러스터 등등 같은 것을 저장해 줘야하는데

이를 한 클래스에서 다른이름으로 생성하면 생성 할때마다 속성값을 지정해 줘야 하는 불편

함이 있다. 그렇다고 다른 클래스로 생성하여 그것을 미리 설정하면 클래스를 재사용 하기에

불편함 이 생긴다. 이문제들을 해결하는게 빌더 패턴.

즉. 각각의 피자의 속성값을 생성 할 때부터 미리 정해 놓을수 있는데.

같은 객체타입으로 다룰수 있다는 것.



장점.

1. 제품에 대한 내부 표현을 다양하게 변화 할 수 있다.

2. 생성과 표현에 필요한 코드를 분리한다.

3. 복합 객체를 생성하는 절차를 좀 더 세밀하게 나눌 수 있다.



#include <iostream>


class CProduct

{

public:

void setHead( char* pHead ){ cout << pHead << endl; }

void setBody( char* pBody ){ cout << pBody << endl; }

void setLeg( char* pLeg ) { cout << pLeg << endl; }

};


// 빌더

class cBuilder

{

protected:

cProduct* pProduct;

public:

virtual void buildHead() = 0;

virtual void buildBody() = 0;

virtual void buildLeg() = 0;

public:

virtual ~cBuilder(){}

};


// 이를 상속받는 플레잉

class cPlayer : public cBuilder

{

public:

void buildHead()

{

pProduct = new cProduct;

pProduct->setHead("머리");

delete pProduct;

}

void buildBody()

{

pProduct = new cProduct;

pProduct->setHBody("몸");

delete pProduct;

}

void buildLeg()

{

pProduct = new cProduct;

pProduct->setLeg("다리");

delete pProduct;

}

public:

~cPlayer(){}

};


// 각 객체들을 하나로 합쳐주는 디렉터

class cDirector

{

public:

void setBuilder( cBuilder* pb )

{

pb->buildHead();

pb->buildBody();

pb->buildLeg();

}

};


//사용

void main()

{

cDirector* pDirector = new cDirector;

cBuilder* pPlayer = new cPlayer;


pDirector->setBuilder( pPlayer );


delete pPlayer;

delete pDirector;

}


각각의 사용 할 클래스들을 동적 할당을 하고 마지막에는 삭제를 하고 있다.

먼저 디렉터 클래스 setBuilder함수를 보면 매개변수로 cBuilder의 포인트를 받고 있다.

위에서 cPlayer클래스로 동적할당을 하므로 자식클래스인 cPlayer클래스의 기능을 갖는다.

결과는 뭐 그냥

-> 머리

-> 몸

-> 다리