选自《大话设计模式》
建造者模式--将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
这样隐藏了产品是如何组装的,要给变一个产品的内部表示,只要再定义一个具体的建造者就可以。
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分和它的装配方式时适用。
//product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
#include <iostream>
#include <string>
#include <list>
using namespace std;
class product
{
public:
product() {}
virtual ~product()
{
for(list<string *>::iterator iter = parts.begin(); iter != parts.end(); iter++)
{
delete *iter;
*iter = NULL;
}
}
void add(const string &part)
{
parts.push_back(new string(part));
}
void show()
{
for(list<string *>::iterator iter = parts.begin(); iter != parts.end(); iter++)
{
cout << *(*iter) << " ";
}
cout << endl;
}
private:
list<string *> parts;
};
class builder
{
public:
builder() {}
virtual ~builder() {}
virtual void buildProductA() = 0;
virtual void buildProductB() = 0;
virtual product *getResult() = 0;
};
class concreteBuilder1: public builder
{
public:
concreteBuilder1():pro(new product()) {}
~concreteBuilder1()
{
delete pro;
pro = NULL;
}
void buildProductA()
{
pro->add("部件A");
}
void buildProductB()
{
pro->add("部件B");
}
product *getResult()
{
return pro;
}
private:
product *pro;
};
class concreteBuilder2: public builder
{
public:
concreteBuilder2():pro(new product()) {}
~concreteBuilder2()
{
delete pro;
pro = NULL;
}
void buildProductA()
{
pro->add("部件X");
}
void buildProductB()
{
pro->add("部件Y");
}
product *getResult()
{
return pro;
}
private:
product *pro;
};
class director
{
public:
void construct(builder *bu)
{
bu->buildProductA();
bu->buildProductB();
}
};
#endif
#include <iostream>
#include "product.h"
using namespace std;
int main()
{
director dir;
concreteBuilder1 *builder1 = new concreteBuilder1();
concreteBuilder2 *builder2 = new concreteBuilder2();
product *pro = NULL;
dir.construct(builder1);
pro = builder1->getResult();
pro->show();
dir.construct(builder2);
pro = builder2->getResult();
pro->show();
delete builder1;
builder1 = NULL;
delete builder2;
builder2 = NULL;
return 0;
}