今天學習了建造者模式,目前較為復雜的一個模式之一。但是思考起來就覺得她很像抽象工廠的生產者模式。
但是比生產者多了一個導演著的身份,這個指揮著建造者去生產誰。。。
所以,這個模式還是挺有意思的。直接上UML圖。
我們生產兩種商品,兩種商品是有廠家決定,商品只決定具有哪些。因此,這時候是有生產者說了算。
但是還有一個更高級的指揮者,那就是 導演類。安排生產。
好了直接上代碼,大家自己看吧
[cpp]
// Builder.cpp : 定義控制台應用程序的入口點。
//
//************************************************************************/
/* @filename Builder.cpp
@author wallwind
@createtime 2012/10/23 23:35
@function 建造者模式
@email [email protected]
*/
/************************************************************************/
#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;
}