今天学习了建造者模式,目前较为复杂的一个模式之一。但是思考起来就觉得她很像抽象工厂的生产者模式。
但是比生产者多了一个导演着的身份,这个指挥着建造者去生产谁。。。
所以,这个模式还是挺有意思的。直接上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;
- }