设计模式(九)建造者模式
2016-04-29 13:44
190 查看
(九)建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
示例一:
示例二:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
示例一:
#include <string> #include <iostream> #include <vector> using namespace std; class Person { public: virtual void CreateHead()=0; virtual void CreateHand()=0; virtual void CreateBody()=0; virtual void CreateFoot()=0; }; class ThinPerson : public Person { public: virtual void CreateHead() { cout<<"thin head"<<endl; } virtual void CreateHand() { cout<<"thin hand"<<endl; } virtual void CreateBody() { cout<<"thin body"<<endl; } virtual void CreateFoot() { cout<<"thin foot"<<endl; } }; class ThickPerson : public Person { public: virtual void CreateHead() { cout<<"ThickPerson head"<<endl; } virtual void CreateHand() { cout<<"ThickPerson hand"<<endl; } virtual void CreateBody() { cout<<"ThickPerson body"<<endl; } virtual void CreateFoot() { cout<<"ThickPerson foot"<<endl; } }; //指挥者类 class Direct { private: Person* p; public: Direct(Person* temp) { p = temp;} void Create() { p->CreateHead(); p->CreateBody(); p->CreateHand(); p->CreateFoot(); } }; //客户端代码: int main() { Person *p=new ThickPerson(); Direct *d= new Direct(p); d->Create(); delete d; delete p; return 0; }
示例二:
#include <string> #include <iostream> #include <vector> using namespace std; //最终的产品类 class Product { private: vector<string> m_product; public: void Add(string strtemp) { m_product.push_back(strtemp); } void Show() { vector<string>::iterator p=m_product.begin(); while (p!=m_product.end()) { cout<<*p<<endl; p++; } } }; //建造者基类 class Builder { public: virtual void BuilderA()=0; virtual void BuilderB()=0; virtual Product* GetResult()=0; }; //第一种建造方式 class ConcreteBuilder1 : public Builder { private: Product* m_product; public: ConcreteBuilder1() { m_product=new Product(); } virtual void BuilderA() { m_product->Add("one"); } virtual void BuilderB() { m_product->Add("two"); } virtual Product* GetResult() { return m_product; } }; //第二种建造方式 class ConcreteBuilder2 : public Builder { private: Product * m_product; public: ConcreteBuilder2() { m_product=new Product(); } virtual void BuilderA() { m_product->Add("A"); } virtual void BuilderB() { m_product->Add("B"); } virtual Product* GetResult() { return m_product; } }; //指挥者类 class Direct { public: void Construct(Builder* temp) { temp->BuilderA(); temp->BuilderB(); } }; //客户端 int main() { Direct *p=new Direct(); Builder* b1=new ConcreteBuilder1(); Builder* b2=new ConcreteBuilder2(); p->Construct(b1);//调用第一种方式 Product* pb1=b1->GetResult(); pb1->Show(); p->Construct(b2); //调用第二种方式 Product * pb2=b2->GetResult(); pb2->Show(); return 0; }
相关文章推荐
- 在代码中修改TextView的DrawableRight图片
- easyui onSortColumn:alertColumn
- [ Office 365 开发系列 ] 身份认证
- jQuery函数的等价原生函数【转载】
- Guava教程-RateLimiter
- MongoDB 针对嵌套对象,多层级结构存储,增删改查
- 学习scanf的一些摘录
- 博客转移到github上了,csdn的博客就关了。
- Excel函数
- HDU 1001 Sum Problem
- 33层高楼为什么27楼和28楼最贵 次顶层房价高原因揭秘
- novnc的替代品Guacamole
- 心灵鸡汤之20160429
- swift 扫描二维码/条形码,开启闪光灯,识别相册二维码
- IOS IAP APP内支付 Java服务端代码
- 数据结构之字符串ADT
- HDU 1000 A + B Problem
- Error:Execution failed for task ':app:transformClassesWithDexForDebug&#
- Git基础学习记录(一)
- Android 监听前台后台切换