用代码和UML图化解设计模式之《创建者模式》

来源:互联网 发布:js canvas filltext 编辑:程序博客网 时间:2024/05/16 18:34

今天学习了建造者模式,目前较为复杂的一个模式之一。但是思考起来就觉得她很像抽象工厂的生产者模式。

 

但是比生产者多了一个导演着的身份,这个指挥着建造者去生产谁。。。

 

所以,这个模式还是挺有意思的。直接上UML图。

 

我们生产两种商品,两种商品是有厂家决定,商品只决定具有哪些。因此,这时候是有生产者说了算。

 

但是还有一个更高级的指挥者,那就是 导演类。安排生产。

 

好了直接上代码,大家自己看吧

 

 

// Builder.cpp : 定义控制台应用程序的入口点。////************************************************************************/    /* @filename    Builder.cpp@author       wallwind  @createtime    2012/10/23 23:35@function     建造者模式@email       wochenglin@qq.com  */    /************************************************************************/   #include "stdafx.h"#include <iostream>#include <vector>#include<string>using namespace std;class Product{public:Product(){m_part = new vector<string>;}virtual ~Product(){if (m_part){delete m_part;}}void addPart(string part){m_part->push_back(part);}void showPro(){vector<string>::iterator it = m_part->begin();for(;it!=m_part->end();it++)cout<<*it<<endl;}private:vector<string> *m_part;};class Builder{public:Builder(){}virtual ~Builder(){}virtual void BuildPartA(){}virtual void BuildPartB(){}virtual Product* getProduct() const{return NULL;}};class ConcreteBuider1 : public Builder{public:ConcreteBuider1(){}virtual ~ConcreteBuider1(){}virtual void BuildPartA(){m_product->addPart("ConcreteBuider1:BuildPartA");}virtual void BuildPartB(){m_product->addPart("ConcreteBuider1:BuildPartB");}virtual Product* getProduct() const{return m_product;}private :Product * m_product;};class ConcreteBuider2: public Builder{public:ConcreteBuider2(){}virtual ~ConcreteBuider2(){}virtual void BuildPartA(){m_product->addPart("ConcreteBuider2:BuildPartA");}virtual void BuildPartB(){m_product->addPart("ConcreteBuider2:BuildPartB");}virtual Product* getProduct() const{return m_product;}private :Product * m_product;};class Director{public:Director(){}~Director(){}void CreateProduct(Builder *build){build->BuildPartA();build->BuildPartB();}};int _tmain(int argc, _TCHAR* argv[]){Builder *build1 =new ConcreteBuider1();Director director;director.CreateProduct(build1);Product* product1=build1->getProduct();product1->showPro();Builder *build2 =new ConcreteBuider2();director.CreateProduct(build2);Product* product2=build2->getProduct();product2->showPro();return 0;}


 

ok 今天就到这里。。。。继续学习

 

更多文章,欢迎访问:

http://blog.csdn.net/wallwind

 

原创粉丝点击