Builder 模式
2014-04-28 14:52
288 查看
Builder 模式和 AbstractFactory 模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder 模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说 Builder 模式中对象不是直接返回的。而在 AbstractFactory 模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。
![](http://images.cnitblog.com/i/627366/201404/281443117987466.jpg)
以上代码都是经过测试可以正常运行的哦···········
![](http://images.cnitblog.com/i/627366/201404/281443117987466.jpg)
////////////Product.h////////////////////// #ifndef _PRODUCT_H_ #define _PRODUCT_H_ #include <vector> #include <string> class Product { public: Product(); ~Product(); void Add( std::string part); void Show(); protected: private: std::vector<std::string> svec; }; #endif
////////////Product.cpp////////////////////// #include "Product.h" #include <iostream> using namespace std; void Product::Add( string part) { svec.push_back(part); } void Product::Show() { vector<string>::iterator it = svec.begin(); while (it != svec.end()) { cout<<*it<<" "; it++; } cout<<endl; } Product::Product(){} Product::~Product(){}
////////////Builder.h////////////////////// #ifndef _BUILDER_H #define _BUILDER_H #include <string> using namespace std; class Product ; class Builder { public: virtual ~Builder(); virtual void BuildPartA() = 0 ; virtual void BuildPartB() = 0 ; virtual void BuildPartC() = 0 ; virtual Product* GetProduct() = 0 ; protected: Builder(); private: }; class ConcreteBuilder : public Builder { public: ~ConcreteBuilder(); ConcreteBuilder(); void BuildPartA(); void BuildPartB(); void BuildPartC(); Product* GetProduct(); protected: private: Product* product; }; class ConcreteBuilder2 : public Builder { public: ~ConcreteBuilder2(); ConcreteBuilder2(); void BuildPartA(); void BuildPartB(); void BuildPartC(); Product* GetProduct(); protected: private: Product* product; }; #endif
/////////Builder.cpp////////////////// #include "Builder.h" #include "Product.h" #include <iostream> using namespace std; Builder::Builder(){} Builder::~Builder(){} ConcreteBuilder::ConcreteBuilder() { product = NULL; } ConcreteBuilder::~ConcreteBuilder() { } void ConcreteBuilder::BuildPartA() { product = new Product(); product->Add("A"); cout<<"加入A"<<endl; } void ConcreteBuilder::BuildPartB() { product->Add("B"); cout<<"加入B"<<endl; } void ConcreteBuilder::BuildPartC() { product->Add("C"); cout<<"加入C"<<endl; } Product* ConcreteBuilder::GetProduct() { return product ; } ConcreteBuilder2::ConcreteBuilder2() { product = NULL; } ConcreteBuilder2::~ConcreteBuilder2() { } void ConcreteBuilder2::BuildPartA() { product = new Product(); product->Add("x"); cout<<"加入x"<<endl; } void ConcreteBuilder2::BuildPartB() { product->Add("y"); cout<<"加入y"<<endl; } void ConcreteBuilder2::BuildPartC() { product->Add("z"); cout<<"加入z"<<endl; } Product* ConcreteBuilder2::GetProduct() { return product ; }
////////////////////////////Director.h////////////////////////////////////////////// #ifndef _DIRECTOR_H #define _DIRECTOR_H class Builder; class Director { public: Director( Builder* bld); ~Director(); void Construct(); protected: private: Builder* _bld ; }; #endif
//////////////////////////////Director.cpp//////////////////////////////////////////// #include "Director.h" #include "Builder.h" using namespace std ; Director::Director(Builder* bld) { _bld = bld ; } Director::~Director() { } void Director::Construct() { _bld->BuildPartA(); _bld->BuildPartB(); _bld->BuildPartC(); }
/////////////////////////////main.cpp///////////////////////////////////////////// #include "Builder.h" #include "Director.h" #include "Product.h" using namespace std; int main() { Builder* b1 = new ConcreteBuilder(); Director* d1 = new Director(b1); d1->Construct(); Product* p1 = b1->GetProduct(); p1->Show(); Builder* b2 = new ConcreteBuilder2(); Director* d2 = new Director(b2); d2->Construct(); Product* p2 = b2->GetProduct(); p2->Show(); system("pause"); return 0; }
以上代码都是经过测试可以正常运行的哦···········
相关文章推荐
- Arduino初初教程6——串口的使用
- Build path ->No action available/classpath .project 解决办法
- uevent
- Arduino的ADXL345库文件(附下载链接)
- UIView之endEditing方法
- 修改easyui的easyloader的默认css目录路径
- iOS7 UITableView做成类似iOS6风格
- QtMultimedia编译出错的解决方法 make[1]: ***[audiorecord.o] Error 1ui_audiorecord.h:174:error: ‘class QLineEdi
- 常用UI元素
- MySQL图形工具MySQL GUI Tools的安装
- Ubuntu 10.04 下建立Mini GUI环境
- 让easyui的datagrid的field支持属性的子属性(field.childfield)
- Easy Arduino: 两个项目来帮助你开始
- 频率学派(Frequentists) 贝叶斯学派(Bayesians)
- [算法]最长公共子序列--LCS(Longest Common Subsequence)
- 使用UISearchDisplayController显示搜索结果
- adcfgclone.pl运行ouicli.pl错误
- 百度编辑器ueditor通过ajax方式提交,不需要事先转义字符的方法(异常:从客户端(xxx)中检测到有潜在危险的 Request.Form 值)
- 使用Espresso进行UI测试ClickView On Multiple Window
- CheckBoxList 前台 获取 DataValueField