设计模式学习之生成器模式与实例
2017-09-11 22:53
441 查看
使用意图:
将一个复杂对象的构建与他的表示分离,是的同样的构建过程可以创建不同的表示参与者:
1 抽象生成器(builder)
构造一个使用生成器的接口2 具体生成器(concreteBuilder)
实现抽象生成器的接口和装配改产品的各个部件定义并明确它所创建的表示
提供一个检索产品的接口(getProduct)
3 产品(product)
表示被构建的复杂对象,具体的生成器对象创建该产品内部的表示并定义它的装配过程包含定义组成部件的类,包括将这些部件组装成最终的产品
4 导向器(Director)
构造一个使用生成器的对象适用性
当创建复杂对象的算法应该独立于该对象的组成部分一起他们的装配方式时当构造的过程必须允许被构造的对象有不同的表示时
实例:
(实例参考自:http://blog.csdn.net/xufeng0991/article/details/50267803): //产品类 class CComputer { public: void setCPU(string strCPU) { m_strCPU = strCPU; } void setMonitor(string strMonitor) { m_strMonitor = strMonitor; } void setHost(string strHost) { m_strHost = strHost; } void displayConfigInfo() { cout <<"CPU: "<< m_strCPU.c_str() << endl; cout << "Host: " << m_strHost.c_str() << endl; cout <<"Monitor: "<< m_strMonitor.c_str() << endl; } private: string m_strCPU; string m_strMonitor; string m_strHost; }; //抽象生成器类 class CBuilder { public: virtual void makeCPU() = 0; virtual void makeMonitor() = 0; virtual void makeHost() = 0; virtual CComputer* getComputer() = 0; }; //具体生成器类 class CDellBuilder : public CBuilder { public: CDellBuilder() { m_Computer = new CComputer(); } virtual ~CDellBuilder() { if (m_Computer != NULL) { delete m_Computer; m_Computer = NULL; } } void makeCPU() { m_Computer->setCPU("Dell CPU"); } void makeMonitor() { m_Computer->setMonitor("Dell Monitor"); } void makeHost() { m_Computer->setHost("Dell Host"); } CComputer* getComputer() { return m_Computer; } private: CComputer* m_Computer; }; //具体生成器类 class CASUSBuilder : public CBuilder { public: CASUSBuilder() { m_Computer = new CComputer(); } virtual ~CASUSBuilder() { if (m_Computer != NULL) { delete m_Computer; m_Computer = NULL; } } void makeCPU() { m_Computer->setCPU("ASUS CPU"); } void makeMonitor() { m_Computer->setMonitor("ASUS Monitor"); } void makeHost() { m_Computer->setHost("ASUS Host"); } CComputer* getComputer() { return m_Computer; } private: CComputer* m_Computer; }; //使用生成器接口对象的类 class CDirector { public: CDirector(CBuilder* builder) { m_builder = builder; } void constuct() { m_builder->makeCPU(); m_builder->makeMonitor(); m_builder->makeHost(); } private: CBuilder* m_builder; }; int main(int argc, char* argv[]) { printf("Start !!\n"); system("pause"); CDirector * direc = NULL; CBuilder* builder = NULL; builder = new CDellBuilder(); direc = new CDirector(builder); direc->constuct(); builder->getComputer()->displayConfigInfo(); system("pause"); delete builder; builder = NULL; delete direc; direc = NULL; builder = new CASUSBuilder(); direc = new CDirector(builder); direc->constuct(); builder->getComputer()->displayConfigInfo(); system("pause"); delete builder; builder = NULL; delete direc; direc = NULL; return 0; }补充 当我们需要新增一种新的创建方式时,我们只需要重新实现一个具体的生成器类就行了。
总结:感觉生成器模式和工厂方法模式也差不多。但他们的重点也不一样。生成器模式这种于将负复杂的创建模式一步步分解,如上面的实例中将分别调用makeFloor、makeDoor等函数最后返回产品对象。工厂模式是立即返回了产品对象。
相关文章推荐
- Java-工厂设计模式-学习实例
- 设计模式C++学习笔记之二十(完结篇 & 面向对象原则)设计模式C++实例下载
- 跟着实例学习设计模式(9)-桥接模式bridge(结构型)
- 设计模式深入学习-Builder生成器(创建型模式 )
- 设计模式学习总结:生成器模式(Builder)
- 跟着实例学习设计模式(9)-桥接模式bridge(结构型)
- 跟着实例学习设计模式(3)-工厂方法(创建型)
- 跟着实例学习设计模式(6)-生成器模式builder(创建型)
- 设计模式学习总结系列应用实例
- 设计模式学习-Builder(生成器
- 【Java学习笔记】21:单实例设计模式
- 设计模式学习-Builder(生成器
- 设计模式学习笔记(四)——Builder生成器模式
- 设计模式实例学习-桥接模式
- JS设计模式学习实例之单例模式
- 设计模式学习-及实例源码和电子书下载
- 设计模式实例学习-单例模式(Android中的使用场景)
- 设计模式实例学习-策略模式
- 设计模式学习笔记(四)——Builder生成器模式
- 设计模式实例学习-抽象工厂模式