C++设计模式——建造者模式(Builder)

一、什么是建造者模式?

建造者模式是一种创建型的软件设计模式,用于构造相对复杂的对象。

建造者模式可以将复杂对象的构建与它的表示分离,使得相同的构建过程可以得到不同的表示。如果说工厂模式和抽象工厂模式更注重产品整体,那建造者模式则更在乎产品的组成和细节

建造者模式的优点:
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;
}

相关推荐

  1. C++设计模式——建造模式(Builder)

    2023-12-07 04:40:01       47 阅读
  2. 设计模式-建造模式Builder

    2023-12-07 04:40:01       28 阅读
  3. 设计模式-建造模式Builder Pattern)

    2023-12-07 04:40:01       32 阅读
  4. 设计模式--建造模式Builder Pattern)

    2023-12-07 04:40:01       23 阅读
  5. 设计模式建造模式Builder Pattern)

    2023-12-07 04:40:01       15 阅读
  6. 设计模式】3、builder 建造模式

    2023-12-07 04:40:01       17 阅读
  7. 设计模式——建造模式Builder

    2023-12-07 04:40:01       13 阅读
  8. 建造模式Builder

    2023-12-07 04:40:01       40 阅读
  9. 建造模式(Builder)

    2023-12-07 04:40:01       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 04:40:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 04:40:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 04:40:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 04:40:01       20 阅读

热门阅读

  1. ES6拓展API

    2023-12-07 04:40:01       35 阅读
  2. Socket.D 网络应用协议,首版发布!

    2023-12-07 04:40:01       40 阅读
  3. 字符指针变量

    2023-12-07 04:40:01       38 阅读
  4. 数据结构-基数排序

    2023-12-07 04:40:01       43 阅读
  5. 利用 Python 进行数据分析实验(二)

    2023-12-07 04:40:01       43 阅读
  6. linux系统调用介绍

    2023-12-07 04:40:01       42 阅读
  7. Vue的methods中定时器的变量报错问题

    2023-12-07 04:40:01       43 阅读
  8. C++ day50 买卖股票最佳时机

    2023-12-07 04:40:01       41 阅读
  9. linux优化-平均负载率

    2023-12-07 04:40:01       39 阅读
  10. 数据结构 / 队列 / 循环队列 / 结构体定义和创建

    2023-12-07 04:40:01       46 阅读
  11. vue的模板语法

    2023-12-07 04:40:01       43 阅读
  12. 使用右值常量进行测试的boost::foreach模块

    2023-12-07 04:40:01       43 阅读
  13. Vue经典面试题源码级分析【一】

    2023-12-07 04:40:01       44 阅读
  14. C#学习相关系列之数组---常用方法使用(二)

    2023-12-07 04:40:01       42 阅读