- 복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 분리하여, 서로 다른 표현 결과를 만들 수 있게 하는 패턴
- 복합 객체의 생성 알고리즘이 이를 합성하는 요소 객체들이 무엇인지 이들의 조립 방법에 독립적일 때
- 합성 할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야 할 때
- 제품에 대한 내부 표현을 다양하게 변화할 수 있다.
- 생성과 표현에 필요한 코드를 분리한다.
- 복합 객체를 생성하는 절차를 좀 더 세밀하게 나눌 수 있다.
CProduct 클래스
class CProduct { public: CProduct() {}; ~CProduct() {}; public: string m_strName; bool m_bDMB; int m_nPrice; };
CProudctBuilder 클래스
class CProductBuilder { public: virtual void BuildProduct() {}; virtual void BuildName(string strName) {}; virtual void BuildDMB(bool bDMB) {}; virtual void BuildPrice(int nPrice) {}; virtual CProduct* GetProduct() { return 0; }; protected: CProductBuilder() {}; };
CPhoneBuilder, CPhoneTestBuilder 클래스
class CPhoneBuilder : public CProductBuilder { public: CPhoneBuilder() {}; virtual void BuildProduct() { pPhone = new CProduct; }; virtual void BuildName(string strName) { pPhone->m_strName = strName; }; virtual void BuildDMB(bool bDMB) { pPhone->m_bDMB = bDMB; }; virtual void BuildPrice(int nPrice) { pPhone->m_nPrice = nPrice; }; virtual CProduct* GetProduct() { return pPhone; }; private: CProduct* pPhone; }; class CPhoneTestBuilder : public CProductBuilder { public: CPhoneTestBuilder() {}; virtual void BuildProduct() { cout << "Start Testing..." << endl << "Create Phone" << endl; }; virtual void BuildName(string strName) { cout << "Name : " << strName.c_str() << endl; }; virtual void BuildDMB(bool bDMB) { cout << "DMB : " << (bDMB ? "O" :"X") << endl; }; virtual void BuildPrice(int nPrice) { cout << "Price : $" << nPrice << endl; }; virtual CProduct* GetProduct() { cout << "Finish Testing" << endl; return 0; }; };
CManufacturer 클래스
class CManufacturer { public: void CreateProduct(CProductBuilder& rProductBuilder) { rProductBuilder.BuildProduct(); rProductBuilder.BuildName("Phone1"); rProductBuilder.BuildPrice(100); }; };
실행 부분
void main() { CManufacturer Manufacturer; CPhoneTestBuilder PhoneTestBuilder; Manufacturer.CreateProduct(PhoneTestBuilder); PhoneTestBuilder.GetProduct(); cout << endl << endl; CPhoneBuilder PhoneBuilder; Manufacturer.CreateProduct(PhoneBuilder); auto_ptr<CProduct> apProduct(PhoneBuilder.GetProduct()); cout << "Name : " << apProduct->m_strName.c_str() << ", Price : " << apProduct->m_nPrice << endl; }
UML - class 다이어그램
참고
- http://seungdols.tistory.com/entry/GoF%EC%9D%98-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%83%9D%EC%84%B1-%ED%8C%A8%ED%84%B4
- http://tadis.tistory.com/entry/7-%EC%83%9D%EC%84%B1%ED%8C%A8%ED%84%B4-2-%EB%B9%8C%EB%8D%94-Builder-1
- http://blog.naver.com/jak500/220281491215
댓글 없음:
댓글 쓰기
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.