用代码和UML图化解设计模式之《创建者模式》
今天学习了建造者模式,目前较为复杂的一个模式之一。但是思考起来就觉得她很像抽象工厂的生产者模式。
但是比生产者多了一个导演着的身份,这个指挥着建造者去生产谁。。。
所以,这个模式还是挺有意思的。直接上UML图。
我们生产两种商品,两种商品是有厂家决定,商品只决定具有哪些。因此,这时候是有生产者说了算。
但是还有一个更高级的指挥者,那就是 导演类。安排生产。
好了直接上代码,大家自己看吧
[cpp]
// 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;
}
补充:软件开发 , C++ ,