设计模式之 创建者(Builder)模式(C++实现)
2016-03-31 22:52
453 查看
这篇文章介绍设计模式中 "创建型模式"的第三种 —— 创建者(Builder)模式。
创建者模式将复杂对象的构造和表示相分离,同样的构建过程可以创建不同的表示。
其强调创建产品的过程是有步骤的,有时候甚至可以强制指定构建次序。
其中产品的不同表现形式是通过扩展 构造器 实现的。
下面以汽车产品为例进行说明,比如汽车包括:汽车厂商 汽车引擎 汽车底盘 汽车轮胎。
一个汽车厂商生产的汽车,各部件可以采用不同公司生产的,只需对其进行组合即可。
因此定义一个抽象创建者类,该类提供了上述各个部件的实现接口。
对于不同的factory,生成一个相应的创建者Builder(继承自抽象创建者类),实现抽象类中的相应方法即可。
代码如下:
创建者模式将复杂对象的构造和表示相分离,同样的构建过程可以创建不同的表示。
其强调创建产品的过程是有步骤的,有时候甚至可以强制指定构建次序。
其中产品的不同表现形式是通过扩展 构造器 实现的。
下面以汽车产品为例进行说明,比如汽车包括:汽车厂商 汽车引擎 汽车底盘 汽车轮胎。
一个汽车厂商生产的汽车,各部件可以采用不同公司生产的,只需对其进行组合即可。
因此定义一个抽象创建者类,该类提供了上述各个部件的实现接口。
对于不同的factory,生成一个相应的创建者Builder(继承自抽象创建者类),实现抽象类中的相应方法即可。
代码如下:
#include <iostream> #include <string> #include <memory> using namespace std; // 产品(包括多个部件) class CCar { public: void setManufactory(const string& manufactory) { m_strManufactory = manufactory; } const string& getManufactory() { return m_strManufactory; } // 部件1 void setEngine(const string& engine) { m_strEngine = engine; } const string& getEngine() { return m_strEngine; } // 部件2 void setUnderPan(const string& underPan) { m_strUnderPan = underPan; } const string& getUnderPan() { return m_strUnderPan; } // 部件3 void setWheel(const string& wheel) { m_strWheel = wheel; } const string& getWheel() { return m_strWheel; } void printInfo() { cout << m_strManufactory << " " << m_strEngine << " " << m_strUnderPan << " " << m_strWheel << endl; } private: string m_strManufactory; string m_strEngine; string m_strUnderPan; string m_strWheel; }; // Abstract Builder class CCarBuildBase { public: // 不变的部分作为公开接口函数 这里的接口需要稳定 CCar* build() { buildManufactory(); buildEngine(); buildUnderPan(); buildWheel(); return &m_car; } protected: // 可变的部分由子类实现 // 复杂Car对象由以下几个模块组成 virtual void buildManufactory() = 0; virtual void buildEngine() = 0; virtual void buildUnderPan() = 0; virtual void buildWheel() = 0; CCar m_car; }; // 第一个concrete builder class GMCarBuilder :public CCarBuildBase { protected: void buildManufactory() { m_car.setManufactory("GM"); } void buildEngine() { m_car.setEngine("劳斯莱斯引擎"); } void buildUnderPan() { m_car.setUnderPan("GM底盘"); } void buildWheel() { m_car.setWheel("Miklon轮胎"); } }; // 第二个concrete builder class FordCarBuilder :public CCarBuildBase { protected: void buildManufactory() { m_car.setManufactory("Ford"); } void buildEngine() { m_car.setEngine("劳斯莱斯引擎"); } void buildUnderPan() { m_car.setUnderPan("Benz底盘"); } void buildWheel() { m_car.setWheel("PulySitong轮胎"); } }; // 创建产品(CCar)的指导类 class CCarDirector { public: CCar* buildCar(CCarBuildBase* pBuilder) { return pBuilder->build(); } }; // 测试函数 void testBuilder() { CCarDirector director; GMCarBuilder gmBuilder; FordCarBuilder fordBuilder; CCar* pCar = director.buildCar(&gmBuilder); pCar->printInfo(); pCar = director.buildCar(&fordBuilder); pCar->printInfo(); delete pCar; pCar = NULL; } int main(void) { testBuilder(); return 0; }
相关文章推荐
- C++作业02
- C++作业2:分段函数
- C++作业2
- c++第三次实验
- C++作业2
- 用平方根算法判断素数(C语言)
- 一起talk C栗子吧(第一百三十三回:C语言实例--创建进程时的内存细节)
- C++实验2-体重与身高
- c++中调用python脚本提示 error LNK2001: 无法解析的外部符号
- 我的C++第二次作业
- 出现次数最多的数
- C++primer 练习10.16
- c++中生成n个m位的随机不重复字符串的一种方法(字母+数字)
- C++第二次实验上机报告(计算标准体重)
- c++指针简述
- C++ 多态
- C++之多态性与虚函数
- C++中的C_str()函数用法
- 智能指针
- 一种实现C++反射功能的想法(三)