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

2014-11-24 09:39:10 · 作者: · 浏览: 1

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

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

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

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

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

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

[cpp]
// Builder.cpp : 定义控制台应用程序的入口点。
//
//************************************************************************/
/* @filename Builder.cpp
@author wallwind
@createtime 2012/10/23 23:35
@function 建造者模式
@email wochenglin@qq.com
*/
/************************************************************************/

#include "stdafx.h"
#include
#include
#include

using namespace std;

class Product
{
public:
Product()
{
m_part = new vector;
}
virtual ~Product()
{
if (m_part)
{
delete m_part;
}
}

void addPart(string part)
{
m_part->push_back(part);
}

void showPro()
{
vector::iterator it = m_part->begin();
for(;it!=m_part->end();it++)
cout<<*it< }
private:
vector *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;
}