-
建造者模式:一种创建型设计模式
-
应用场景:
某类对象的构建过程由多步组成,各步执行细节一直变化,但是所有步骤间的组合关系不变。
举例:
要画一个图形,分为画形状和填色两步,这两步固定不会变,但是具体画的形状与颜色会随着需求而经常变化。
每次形状与颜色的需求变更时,为了不更改原本类的代码,而是通过扩展新类的方式完成,可以通过构建一个建造者,该建造者只能满足某次需求的要求构建出图形(类似于特定的画笔,只能画出来绿色圆或红色三角),然后在需求变更时扩展出一个新的建造者即可。
-
实现方式:
首先,构建要被构造出来的图形类,并向外部提供能修改该图形类各组成部分的接口;
然后,构建建造者的抽象类,所有派生的建造者根据自身作用重写接口,返回不同的图形对象;
最后,构建一个导演类,导演类对象可根据设定的不同构建者,获得不同的图形对象。
-
优点:
将一个复杂对象的构建与它的表示分离,相同的构建过程可以创建不同的表示。
有新的表示可以遵循开放封闭原则,扩展新的类代码完成需求。 -
缺点:
如果构建步骤发生添加或删除,所有建造者类都需要更改代码。
以下是建造者模式的简易代码实现
#include <iostream>
using namespace std;
// 要构建的对象
class Graphic {
public:
Graphic() {}
// 常变属性的设置接口
void SetShape(string strShape) {
m_strShape = strShape;
}
void SetColor(string strColor) {
m_strColor = strColor;
}
// 图形的验证方法
void Show() {
cout << m_strColor << m_strShape << endl;
}
private:
string m_strShape;
string m_strColor;
};
//建造者抽象类
class Builder {
public:
Builder(): m_pGraphic(NULL) {}
// 创建空白图形
void CreateGraphic() {
if (NULL == m_pGraphic) {
m_pGraphic = new Graphic();
}
}
// 获取描绘完成的图形
Graphic* GetGraphic() {
return m_pGraphic;
}
// 留给派生类实现的描绘过程
virtual void DrawShape() = 0;
virtual void DrawColor() = 0;
protected:
Graphic* m_pGraphic;
};
class GreenCircleBuilder: public Builder {
public:
// 根据类的功能实现描绘过程
void DrawShape() {
if (NULL != m_pGraphic) {
m_pGraphic->SetShape("Circle");
}
}
void DrawColor() {
if (NULL != m_pGraphic) {
m_pGraphic->SetColor("Green");
}
}
};
class RedRectangleBuilder: public Builder {
public:
// 根据类的功能实现描绘过程
void DrawShape() {
if (NULL != m_pGraphic) {
m_pGraphic->SetShape("Rectangle");
}
}
void DrawColor() {
if (NULL != m_pGraphic) {
m_pGraphic->SetColor("Red");
}
}
};
class BlueTriangleBuilder: public Builder {
public:
// 根据类的功能实现描绘过程
void DrawShape() {
if (NULL != m_pGraphic) {
m_pGraphic->SetShape("Triangle");
}
}
void DrawColor() {
if (NULL != m_pGraphic) {
m_pGraphic->SetColor("Blue");
}
}
};
// 导演类
class Director {
public:
Director(): m_pBuilder(NULL) {}
// 根据需求设置对应的建造者
void SetBuilder(Builder& pBuilder) {
m_pBuilder = &pBuilder;
}
// 通过建造者获得描绘完成的图形
Graphic* DrawGraphic() {
if (NULL == m_pBuilder) {
return NULL;
}
//建造过程为不变的因素
m_pBuilder->CreateGraphic();
m_pBuilder->DrawShape();
m_pBuilder->DrawColor();
return m_pBuilder->GetGraphic();
}
private:
Builder* m_pBuilder;
};
主函数中的使用
#include <iostream>
#include "builder.hpp"
using namespace std;
int main()
{
Director MyDirector;
// 根据导演的不同需求,分别设置不同的建造者,获得满足需求的图形
GreenCircleBuilder BuilderGC; // 绿色圆形的建造者
MyDirector.SetBuilder(BuilderGC);
Graphic* pGraphicGC = MyDirector.DrawGraphic(); // 导演使用建造者画图
pGraphicGC->Show();
RedRectangleBuilder BuilderRB; // 红色矩形的建造者
MyDirector.SetBuilder(BuilderRB);
Graphic* pGraphicRB = MyDirector.DrawGraphic(); // 导演使用建造者画图
pGraphicRB->Show();
BlueTriangleBuilder BuilderBT; // 蓝色三角的建造者
MyDirector.SetBuilder(BuilderBT);
Graphic* pGraphicBT = MyDirector.DrawGraphic(); // 导演使用建造者画图
pGraphicBT->Show();
// 资源回收
if (NULL == pGraphicGC) {
delete pGraphicGC;
pGraphicGC = NULL;
}
if (NULL == pGraphicRB) {
delete pGraphicRB;
pGraphicRB = NULL;
}
if (NULL == pGraphicBT) {
delete pGraphicBT;
pGraphicBT = NULL;
}
return 0;
}
控制台输出结果
GreenCircle
RedRectangle
BlueTriangle
网友评论