一、建造者模式是什么?
建造者模式是一种创建型的软件设计模式,用于构造相对复杂的对象。
建造者模式可以将复杂对象的构建与它的表示分离,使得相同的构建过程可以得到不同的表示。如果说工厂模式和抽象工厂模式更注重产品整体,那建造者模式则更在乎产品的组成和细节。
建造者模式的优点:
- 封装性好。有效地封装了建造过程(主要业务逻辑),使得系统整体的稳定性得到了一定保证。
- 解耦。产品本身和建造过程解耦,相同的建造过程可以创建出不同的产品。
- 产品建造过程精细化。该模式注重产品创建的整个过程,将复杂的步骤拆解得到多个相对简单的步骤,使得系统流程更清晰,且对细节的把控更精准。
- 易于扩展。如果有新产品需求,只需要添加一个建造者类即可,不需要改动之前的代码,符合开闭原则。
建造者模式的缺点:
- 产品的组成部分和构建过程要一致,限制了产品的多样性。
- 若产品内部有结构上的变化,则整个系统都要进行大改,增加了后期维护成本。
二、建造者模式
2.1 结构图
客户端即Main主函数,创建监督者,由监督者带领不同的建造者完成电脑产品的不同表示。
2.2 代码示例
场景描述:我联系了一家外包公司,由他们的项目经理招人为我组建一批电脑,他先招了联想的团队,项目结束后;我想再弄一批对比下(甲方财大气粗),于是他们又招了惠普的团队,再次完成项目,非常不错。
//Product.h /****************************************************/ #pragma once #include <iostream> using namespace std; // 电脑产品类 class Computer { public: // 获取电脑信息 void getComputer() { cout << "电脑产品配置为:" << endl; cout << " 处理器:" << getCPU() << endl; cout << " 显 卡:" << getGPU() << endl; cout << " 主 板:" << getMainBoard() << endl; cout << " 内存条:" << getRAM() << endl; } // 设置处理器 void setCPU(string cpu){ CPU = cpu; } // 设置显卡 void setGPU(string gpu) { GPU = gpu; } // 设置主板 void setMainBoard(string mb) { mainboard = mb; } // 设置内存条 void setRAM(string ram) { RAM = ram; } // 获取处理器 string getCPU() { return CPU; } // 获取显卡 string getGPU() { return GPU; } // 获取主板 string getMainBoard() { return mainboard; } // 获取内存条 string getRAM() { return RAM; } private: string CPU; // 处理器 string GPU; // 显卡 string mainboard; // 主板 string RAM; // 内存条 };
//Builder.h /****************************************************/ #pragma once #include <iostream> #include "Product.h" using namespace std; // 抽象建造者 class Builder { public: // 装配CPU virtual void addCPU() = 0; // 装配GPU virtual void addGPU() = 0; // 装配主板 virtual void addMainBoard() = 0; // 装配内存 virtual void addRAM() = 0; // 获取电脑产品 Computer getComputer() { return m_computer; } protected: Computer m_computer; // 电脑产品 }; // 联想-建造者 class LenovoBuilder : public Builder { public: // 装配CPU virtual void addCPU() { m_computer.setCPU("Intel 酷睿i7-8700K"); } // 装配GPU virtual void addGPU() { m_computer.setGPU("RTX 4050"); } // 装配主板 virtual void addMainBoard() { m_computer.setMainBoard("B760"); } // 装配内存 virtual void addRAM() { m_computer.setRAM("三星DDR4 2666mhz 16G"); } }; // 惠普-建造者 class HPBuilder : public Builder { public: // 装配CPU virtual void addCPU() { m_computer.setCPU("Intel 酷睿i5-6300HQ"); } // 装配GPU virtual void addGPU() { m_computer.setGPU("GTX 1060"); } // 装配主板 virtual void addMainBoard() { m_computer.setMainBoard("B660"); } // 装配内存 virtual void addRAM() { m_computer.setRAM("金士顿DDR4 2666mhz 16G"); } };
//Director.h /****************************************************/ #pragma once #include <iostream> #include "Builder.h" using namespace std; // 监督者 class Director { public: // 构造函数 Director(Builder* builder) { m_builder = builder; } // 析构函数 ~Director() { if (m_builder != nullptr) delete m_builder; } // 替换建造者 void setBuilder(Builder *builder) { m_builder = builder; } // 建造 Computer construct() { m_builder->addCPU(); m_builder->addGPU(); m_builder->addMainBoard(); m_builder->addRAM(); return m_builder->getComputer(); } private: Builder *m_builder; // 建造者 };
//main.cpp /****************************************************/ #include <iostream> #include <string> #include "Director.h" using namespace std; int main() { // 一号建造者-联想 Builder *builder1 = new LenovoBuilder(); cout << "联想建造者等待就业。" << endl; // 由监督者监督项目启动 Director *director = new Director(builder1); cout << "监督者(项目经理)开始招人做项目。" << endl; // 联想项目完毕,获取联想电脑产品 Computer computer1 = director->construct(); cout << "联想项目结束。" << endl; computer1.getComputer(); // 二号建造者-惠普 Builder *builder2 = new HPBuilder(); cout << "惠普建造者等待就业。" << endl; // 替换建造者 director->setBuilder(builder2); cout << "监督者(项目经理)替换建造者,做新项目。" << endl; Computer computer2 = director->construct(); cout << "惠普项目结束。" << endl; computer2.getComputer(); return 0; }
程序结果如下。
在上述示例中,我们可以看到,产品有相同的构建过程,但是不同的建造者却可以完成不同表示的产品,产品的结构类似,但具体内容各不相同。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对建造者模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解建造者模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!