一、什么是建造者模式?
建造者模式是一种创建型的软件设计模式,用于构造相对复杂的对象。
建造者模式可以将复杂对象的构建与它的表示分离,使得相同的构建过程可以得到不同的表示。如果说工厂模式和抽象工厂模式更注重产品整体,那建造者模式则更在乎产品的组成和细节。
建造者模式的优点:
1、封装性好。有效地封装了建造过程(主要业务逻辑),使得系统整体的稳定性得到了一定保证。
2、解耦。产品本身和建造过程解耦,相同的建造过程可以创建出不同的产品。
3、产品建造过程精细化。该模式注重产品创建的整个过程,将复杂的步骤拆解得到多个相对简单的步骤,使得系统流程更清晰,且对细节的把控更精准。
4、易于扩展。如果有新产品需求,只需要添加一个建造者类即可,不需要改动之前的代码,符合开闭原则。
建造者模式的缺点:
1、产品的组成部分和构建过程要一致,限制了产品的多样性。
2、若产品内部有结构上的变化,则整个系统都要进行大改,增加了后期维护成本。
引用自: [1] https://zhuanlan.zhihu.com/p/631285995
二、建造者模式示例
我有这样一个场景。譬如现在我所做的项目,在整个系统中有一个部分叫做EFEM(一种传片机构),其中包含了loadport、robot和pre–aligner的三个part。对于不同的生产厂家,efem中这三个部分的具体实现可能不同。对应不同的客户,我们在设计产品时可能会配置不同供应商的efem产品,譬如在下例子中的efem厂家HWIN和JEL,这个时候,就需要能在代码中快速的切换不同的efem厂家。
#include <iostream>
#include <string>
using namespace std;
/**
* @brief The EFEMProduct class efem产品
*/
class EFEMProduct
{
public:
EFEMProduct(){}
~EFEMProduct(){}
};
/**
* @brief The Builder class 抽象构建者
*/
class Builder
{
public:
virtual ~Builder(){}
virtual void addLoadport() = 0;
virtual void addRobot() = 0;
virtual void addAligner() = 0;
EFEMProduct& getProduct(){ return m_pd;}
protected:
Builder(){}
EFEMProduct m_pd;
};
/**
* @brief The HwinBuilder class 上银生产的efem
*/
class HwinBuilder : public Builder
{
public:
HwinBuilder(){}
~HwinBuilder(){}
void addLoadport() override { cout << __FUNCTION__ << endl; }
void addRobot() override { cout << __FUNCTION__ << endl; }
void addAligner() override { cout << __FUNCTION__ << endl; }
};
/**
* @brief The JelBuilder class Jel生产的efem
*/
class JelBuilder : public Builder
{
public:
JelBuilder(){}
~JelBuilder(){}
void addLoadport() override { cout << __FUNCTION__ << endl; }
void addRobot() override { cout << __FUNCTION__ << endl; }
void addAligner() override { cout << __FUNCTION__ << endl; }
};
/**
* @brief The Director class 监督者
*/
class Director
{
public:
Director(Builder* bld):m_bld_ptr(bld){}
~Director(){}
///
void construct(){
if(m_bld_ptr == nullptr){
return;
}
m_bld_ptr->addLoadport();
m_bld_ptr->addRobot();
m_bld_ptr->addAligner();
}
private:
Builder* m_bld_ptr = nullptr;
};
int main()
{
/// 在后续需要切换不同efem厂商时,只需要快速指定builder
/// 就可以实现软件上的适配工作。yyds
Director* d_0 = new Director(new HwinBuilder);
d_0->construct();
Director* d_1 = new Director(new JelBuilder);
d_1->construct();
return 0;
}
原文地址:https://blog.csdn.net/weixin_39568531/article/details/134684309
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_40238.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!