• 【Builder模式】C++设计模式——构建器



        C++设计模式大全,23种设计模式合集详解—👉(点我跳转)

    一、设计流程介绍

      未使用Builder模式时会觉得流程和结构不稳定,但实际上是稳定的(如建房子的流程是稳定的、构造不同地方的天花板结构是稳定的…)。如果是采用下面这部分代码,对于对象属性少的来说完全没问题,但是一旦对象变得比较复杂,这样写代码将会使得结构臃肿且不稳定。

    class House{
    public:
    	void Init(){
    		this->BuildPart1();		//静态绑定,不能放在构造函数里
    		for (int i = 0; i < 4; i++){
    			this->BuildPart2();
    		}
    		bool flag = this->BuildPart3();
    		if (flag) {
    			this->BuildPart4();
    		}
    		this->BuildPart5();
    	}
    	virtual ~House(){}
    protected:
    	virtual void BuildPart1() = 0;
    	virtual void BuildPart2() = 0;
    	virtual void BuildPart3() = 0;
    	virtual void BuildPart4() = 0;
    	virtual void BuildPart5() = 0;
    };
    class StoneHouse : public House{
    protected:
    	virtual void BuildPart1(){}
    	virtual void BuildPart2(){}
    	virtual void BuildPart3(){}
    	virtual void BuildPart4(){}
    	virtual void BuildPart5(){}
    };
    int main(){
    	House* pHouse = new StoneHouse();
    	pHouse->Init();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

      当对象比较复杂时,我们还要像下列代码一样创建个Builder,并进行拆分。
    在这里插入图片描述

    class House{
    public:
    	//...
    	virtual ~House(){}
    };
    class HouseBuilder{
    public:
    	House* GetResult(){
    		return pHouse;
    	}
    protected:
    	House* pHouse;
    	virtual void BuildPart1() = 0;
    	virtual void BuildPart2() = 0;
    	virtual void BuildPart3() = 0;
    	virtual void BuildPart4() = 0;
    	virtual void BuildPart5() = 0;
    };
    class HouseDirector{
    public:
    	HouseBuilder* pHouseBuilder;
    	HouseDirector(HouseBuilder* pHouseBuilder){
    		this->pHouseBuilder = pHouseBuilder;
    	}
    	void Construct(){
    		pHouseBuilder->BuildPart1();		//静态绑定,不能放在构造函数里
    		for (int i = 0; i < 4; i++){
    			pHouseBuilder->BuildPart2();
    		}
    		bool flag = pHouseBuilder->BuildPart3();
    		if (flag) {
    			pHouseBuilder->BuildPart4();
    		}
    		pHouseBuilder->BuildPart5();
    	}
    };
    class StoneHouse : public House{
    protected:
    	virtual void BuildPart1(){
    		//pHouse->Part1 = ... 
    	}
    	virtual void BuildPart2(){}
    	virtual void BuildPart3(){}
    	virtual void BuildPart4(){}
    	virtual void BuildPart5(){}
    };
    class StoneHouseBuilder : public HouseBuilder{
    protected:
    	virtual void BuildPart1(){}
    	virtual void BuildPart2(){}
    	virtual void BuildPart3(){}
    	virtual void BuildPart4(){}
    	virtual void BuildPart5(){}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    二、模式介绍

    (1)模式动机
      在软件系统中,有时候面临着 “一个复杂对象” 的创建工作,其通常由各个部分的子对象用一定的算法构成。由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化(与Template模式相似),但是将它们组合在一起的算法却相对稳定。
      如何应对这种变化?如何提供一种 “封装机制” 来隔离出 “复杂对象的各个部分” 的变化,从而保持系统中的 “稳定构建算法” 不随着需求改变而改变?
    (2)模式定义
      将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。
    (3)要点总结
    a). Builder 模式主要用于 “分步骤构建一个复杂的对象”,在这其中 “分步骤” 是一个稳定的算法,而复杂对象的各个部分则经常变化。
    b). 变化点在哪里、封装哪里——Builder模式主要在于应对 “复杂对象各个部分” 的频繁需求变动。其缺点在于难以应对 “分步骤构建算法” 的需求变动。
    c). 在Builder模式中,要注意不同语言中构造器内调用虚函数的差别(如 C#、Java 可以直接在构造器调用虚函数,而C++不能)

    三、代码实现

      在第一点中已展示出相应的代码,这里不做过多的赘述。我们应该要去好好把握稳定与变化间的关系,在该模式的设计中,从变化部分找到稳定的部分来建立Builder

  • 相关阅读:
    【算法刷题 | 动态规划14】6.28(最大子数组和、判断子序列、不同的子序列)
    css网页缩小 ,把2560尺寸的布局改到1920上面
    mysql修改数据库名称
    Elasticsearch索引别名:管理与优化数据访问
    gma 2.0.2 (2023.10.15) 更新日志
    【科学文献计量】中英文文献标题及摘要用词情感分析与可视化
    前端导出图片和各种文件
    Verilog:【5】脉冲展宽器(pulse_stretch.sv)
    链表的分割——哨兵位
    UML/SysML建模工具更新情况(2024年7月)(1)
  • 原文地址:https://blog.csdn.net/u012011079/article/details/125989607