介绍
建造者模式中, 有如下4个角色:
- Product产品类
通常是实现了模板方法模式, 也就是有模板方法和基本方法 - Builder抽象建造者
规范产品的组建, 一般是由子类实现。 - ConcreteBuilder具体建造者
实现抽象类定义的所有方法, 并且返回一个组建好的对象。 - Director导演类
负责安排已有模块的顺序, 然后告诉Builder开始建造。
优点:封装性;建造者独立,容易扩展;便于控制细节风险
使用:
- 相同的方法,不同的执行顺序具有不同结果;
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同;
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能;
- 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。建造者模式最主要的功能是基本方法的
调用顺序安排,也就是这些基本方法已经实现了,通俗地说就是零件的装配,顺序不同产生的对象也不同;而工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。
UML类图:
简单示例:
#ifndef SIMPLE_BUILDER_H
#define SIMPLE_BUILDER_H
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
/**
* @brief The Product class
* Product类 :产品类,由多个部件组成。
*/
class Product
{
public:
void addData(string part)
{
m_list.push_back(part);
}
void showData()
{
for (string part: m_list)
{
cout<<" list part = "<<part<<endl;
}
}
private:
list<string> m_list;
};
/**
* @brief The Builder class
* Builder类:抽象建造者类, 确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法getProduct。
*/
class Builder
{
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual Product *getProduct() = 0;
};
/**
* @brief The ConcreteBuilder1 class
* ConcreteBuilder1 类:具体建造者类。
*/
class ConcreteBuilder1 : public Builder
{
public:
void BuildPartA() override
{
m_product.addData("部件 A");
}
void BuildPartB() override
{
m_product.addData("部件 B");
}
Product *getProduct() override
{
return &m_product;
}
private:
Product m_product;
};
/**
* @brief The ConcreteBuilder2 class
* ConcreteBuilder2类:具体建造者类。
*/
class ConcreteBuilder2 : public Builder
{
public:
void BuildPartA() override
{
m_product.addData("部件 X");
}
void BuildPartB() override
{
m_product.addData("部件 X");
}
Product *getProduct() override
{
return &m_product;
}
private:
Product m_product;
};
/**
* @brief The Director class
* Director:指挥者类
*/
class Director
{
public:
void Construct(Builder &builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
};
#endif // SIMPLE_BUILDER_H
调用代码:
#include "simple_builder.h"
int main()
{
Director *d = new Director;
ConcreteBuilder1 *cb1 = new ConcreteBuilder1;
ConcreteBuilder2 *cb2 = new ConcreteBuilder2;
//指挥者指挥ConcreteBuilder1
d->Construct(*cb1);
//指挥者使用ConcreteBuilder1来创建产品
Product *p1 = cb1->getProduct();
p1->showData();
//指挥者指挥ConcreteBuilder1
d->Construct(*cb2);
//指挥者使用ConcreteBuilder2来创建产品
Product *p2 = cb2->getProduct();
p2->showData();
return 0;
}