빌더( 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클래스의 기능을 갖는다.
결과는 뭐 그냥
-> 머리
-> 몸
-> 다리
- Filed under : 디자인 패턴/2. 빌더( Builder )