建造者模式简介
建造者模式是一种对象创建型模式之一,用来隐藏复杂对象的创建过程,把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态的创建具有复合属性的对象。官方说法就是将一个复杂对象的构造与它的表示分离的过。(B站C语言老师视频内容)
PS:将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式分为四个模块:
1. 抽象建造者:主要包含创建对象各个部件的抽象函数接口和返回复杂对象的结构函数。
2. 具体建造者:实现抽象建造者中的接口,实现各个部件的具体创建函数,也可以返回一个创建好的复杂产品对象
3. 产品:被构建的复杂对象,包含多个组成部件
4. 指挥者:实现复杂产品的建造次序,调用具体建造者对象的部件构造与装配方法,完成复杂对象的建造。
个人理解:
建造者模式本质是使用抽象类定义部件,使用具体建造者类实现部件,在具体产品中选择部件并给出构造接口,在指挥者类中将产品按流程构建出来。
打个比喻:抽象建造者相当于一个集合了各个部件的设计图纸;具体建造者就是实现图纸中各个部件建造;产品类相当于产品的构建图纸,封装了整个产品的部件;指挥者模式就是调用抽象建造者中的函数构建出一个产品。
建造者模式实现:
-
提供抽象建造者类:为创建产品各个部分,统一抽象接口。
-
提供具体建造者类:具体实现抽象建造者各个部件的接口。
-
提供多个具体产品类:具体的创建产品的各个部分。
-
提供一个指挥类:负责安排和调度复杂对象的各个建造过程。
示例代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//抽象产品类
class AbstractProduct
{
public:
virtual void SetDisplayer(string display) = 0;
virtual void SetMouse(string mouse) = 0;
virtual void SetKeybord(string keybord) = 0;
virtual void SetHost(string host) = 0;
virtual void Show();
};
//具体产品类电脑类
class Computer : public AbstractProduct
{
public:
void SetDisplayer(string display)
{
m_list.push_back(display);
}
void SetMouse(string mouse)
{
m_list.push_back(mouse);
}
void SetKeybord(string keybord)
{
m_list.push_back(keybord);
}
void SetHost(string host)
{
m_list.push_back(host);
}
void Show()
{
cout << "电脑配置:" << endl;
for (auto v : m_list)
cout << v << endl;
}
vector<string> m_list;
};
//抽象建造者类
class AbstractBuilder
{
public:
AbstractBuilder () : product(new Computer) {}
//抽象建造该过程
virtual void BuilderDisplay(string display) = 0;
virtual void BuilderMouse(string mouse) = 0;
virtual void BuilKeyBoard(string keybord) = 0;
virtual void BuilderHost(string host) = 0;
AbstractProduct* Getproduct()
{
return product;
}
protected:
AbstractProduct* product;
};
//具体的建造者类
class ConcreteBuilder : public AbstractBuilder
{
public:
void BuilderDisplay(string displayer)
{
product->SetDisplayer(displayer);
}
virtual void BuilderMouse(string mouse)
{
product->SetMouse(mouse);
}
virtual void BuilKeyBoard(string keybord)
{
product->SetKeybord(keybord);
}
virtual void BuilderHost(string host)
{
product->SetHost(host);
}
};
//指挥者类
class Director
{
public:
Director(AbstractBuilder* pBuilder) : pBuilder(pBuilder) {}
AbstractProduct* createProduct(string disaplayer, string mouse, string keybord, string host)
{
pBuilder->BuilderDisplay(disaplayer);
pBuilder->BuilderMouse(mouse);
pBuilder->BuilKeyBoard(mouse);
pBuilder->BuilderHost(host);
return pBuilder->Getproduct();
}
private:
AbstractBuilder* pBuilder;
};
int main()
{
AbstractBuilder* pB = new ConcreteBuilder;
Director* pD = new Director(pB);
AbstractProduct* computer = pD->createProduct("华为显示器", "牧马人鼠标", "雷蛇键盘", "外星人主机");
computer->Show();
return 0;
}
建造者模式优缺点
优点
-
封装性好,构建和表示分离
-
扩展性好,各个具体的建造者相互独立,有利于系统的解耦
-
控制细节风险,客户端无需相纸细节,建造者细化创建过程
缺点
-
产品的组成部分必须相同,这限制了其使用范围
-
产品内部发生变化,建造者需同步修改,后期维护成本大。
PS:本篇博客是B站UP主C语言老师的C++设计模式的视频学习笔记,由于听不懂又翻阅了为设计模式之建造者模式详解_设计模式建造者模式-优快云博客这篇博客,最后掺杂了一点个人理解。有兴趣的朋友可以移步B站观看原视频或者上面的博客。
B站视频链接:C++设计模式之建造者模式_哔哩哔哩_bilibili