作用:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
UML结构图:
适用于以下情况:
1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2)当构造过程必须允许被构造的对象有不同的表示时。
抽象基类:
1)Builder:这个基类是全部创建对象过程的抽象,提供构建不同组成部分的接口函数
接口:
1)Builder::BuildPartA,Builder::BuildPartB:是对一个对象不同部分的构建函数接口,Builder的派生类来具体实现。
另外还有一个需要注意的函数,就是Director::Construct函数,这个函数里面通过调用上面的两个接口函数完成对象的构建——也就是说各个不同部分装配的过程都是一致的(同样的调用的Construct函数),但是不同的构建方式会有不同的表示(根据Builder的实际类型来决定如何构建,也就是多态)
解析:
Builder模式是基于这样的一个情况:一个对象可能有不同的组成部分,这几个部分的不同的创建对象会有不同的表示,但是各个部分之间装配的方式是一致的。比方说一辆单车,都是由车轮车座等等的构成的(一个对象不同的组成部分),不同的品牌生产出来的也不一样(不同的构建方式)。虽然不同的品牌构建出来的单车不同,但是构建的过程还是一样的(哦,你见过车轮长在车座上的么?)。
也就是说,Director::Construct函数中固定了各个组成部分的装配方式,而具体是装配怎样的组成部分由Builder的派生类实现。
实现:
Builder模式的实现基于以下几个面向对象的设计原则:1)把变化的部分提取出来形成一个基类和对应的接口函数,在这里不会变化的是都会创建PartA和PartB,变化的则是不同的创建方法,于是就抽取出这里的Builder基类和BuildPartA,BuildPartB接口函数 2)采用聚合的方式聚合了会发生变化的基类,就是这里Director聚合了Builder类的指针。
1)Builder.h
/**/ /* ******************************************************************* // 使用Builder构建产品,构建产品的过程都一致,但是不同的builder有不同的实现 void Construct(); private : // Builder的派生类,实现BuilderPartA和BuilderPartB接口函数 // Builder的派生类,实现BuilderPartA和BuilderPartB接口函数 #endif |
2)Builder.cpp
/**/ /* ******************************************************************* created: 2006/07/19 filename: Builder.cpp author: 李创 http://www.cppblog.com/converse/ purpose: Builder模式的演示代码 ******************************************************************** */ #include " Builder.h " #include < iostream > void ConcreateBuilder1::BuilderPartA() { std::cout << " BuilderPartA by ConcreateBuilder1n " ; } void ConcreateBuilder1::BuilderPartB() { std::cout << " BuilderPartB by ConcreateBuilder1n " ; } void ConcreateBuilder2::BuilderPartA() { std::cout << " BuilderPartA by ConcreateBuilder2n " ; } void ConcreateBuilder2::BuilderPartB() { std::cout << " BuilderPartB by ConcreateBuilder2n " ; } Director::Director(Builder * pBuilder) : m_pBuilder(pBuilder) { } Director:: ~ Director() { delete m_pBuilder; m_pBuilder = NULL; } // Construct函数表示一个对象的整个构建过程,不同的部分之间的装配方式都是一致的, // 首先构建PartA其次是PartB,只是根据不同的构建者会有不同的表示 void Director::Construct() { m_pBuilder -> BuilderPartA(); m_pBuilder -> BuilderPartB(); } |
3)Main.cpp
/**/ /* ******************************************************************* Builder * pBuilder2 = new ConcreateBuilder2; delete pDirector1; system( " pause " ); return 0 ; |