建造者模式:将一个复杂对象的构建和它的表示分离,使得同样的构造过程可以创建不同的表示;
该模式使得用户只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需知道了;
建造者模式的UML类图为:
该图说明如下:
(1)Builder类:为创建一个Product对象的各个部件指定的抽象接口;
ConcreteBuilder类:具体建造者,实现Builder接口,构建和配置各个部件;
Product:产品角色;
Director:指挥者,构建一个适用Builder接口的对象;
(2)建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临复杂的变化;
(3)该模式的好处:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如果要改变一个产品的内部表示,只需再定义一个具体的建造者就可以了;
建造者模式示例C++代码:
产品类、抽象建造者类及其具体子类、指挥者类的接口builder.h:
#pragma once
#include <iostream>
#include <string>
#include <list>
using namespace std;
//产品类
class Product
{
private:
list<string> parts;
public:
void add(string part){parts.push_back(part);}//添加产品部件
void show()
{
list<string>::iterator itr=parts.begin();
//列举所有的产品部件
for(;itr!=parts.end();itr++)
cout << *itr << ' ';
}
};
//建造者类
class Builder
{
public:
Product *product;
Builder(){product=new Product();}
//声明产品由两个部件组成
virtual void BuildPartA(){}
virtual void BuildPartB(){}
//声明一个得到产品建造后结果的方法
virtual Product *GetResult(){return product;}
};
class ConcreteBuilder1:public Builder
{
public:
//建造两个具体的部件
void BuildPartA(){product->add("part A");}
void BuildPartB(){product->add("part B");}
Product *GetResult(){return product;}
};
class ConcreteBuilder2:public Builder
{
public:
void BuildPartA(){product->add("part X");}
void BuildPartB(){product->add("part Y");}
Product *GetResult(){return product;}
};
//指挥者类
class Director
{
public:
//用来指挥建造过程
void construct(Builder *b)
{
b->BuildPartA();
b->BuildPartB();
}
};
客户端代码:
#include "builder.h"
//客户端不知道具体建造过程
int main()
{
Director d;
Builder *b1 = new ConcreteBuilder1();
Builder *b2 = new ConcreteBuilder2();
d.construct(b1);//指挥者用ConcreteBuilder1的方法来获得建造产品
Product *p1 = b1->GetResult();
cout << "ConcreteBuilder1:" <<endl;
p1->show();
d.construct(b2);//指挥者用ConcreteBuilder2的方法来获得建造产品
Product *p2 = b2->GetResult();
cout << endl << "ConcreteBuilder1:" <<endl;
p2->show();
delete b1;
delete b2;
return 0;
}
代码最终输出为:
建造者模式:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方法时适用的模式。