创建型模式 | 建造者模式

一、建造者模式

1、原理

建造者模式又叫生成器模式,是一种对象的构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。创建者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

2、核心角色

建造者模式的四个核心角色

  • Product(产品角色):一个具体的产品对象
  • Builder(抽象建造者):创建一个Product对象的各个部件指定的接口
  • ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
  • Director(指挥者):构建一个使用Builder接口的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生成过程

3、UML类图

使用建造者模式,创建一个盖房子的程序,UML类图如下:

在这里插入图片描述

代码实现

#include <iostream>
using namespace std;

// 产品
class House {
   
public:
    string m_base;  // 地基
    string m_wall;  // 墙
    string m_roof;  // 屋顶
};

// 抽象的建造者
class IHouseBuilder {
   
public:
    virtual void BuildBase();
    virtual void BuildWall();
    virtual void BuildRoof();
    virtual House* Build();
};

// 具体的建造者:创建普通房子
class CommonHouseBuilder : public IHouseBuilder
{
   
public:
    void BuildBase() override {
   
        cout << "普通房:打地基" << endl;
    }
    void BuildWall() override {
   
        cout << "普通房:建墙" << endl;
    }
    void BuildRoof() override {
   
        cout << "普通房:建房顶" << endl;
    }
    House* Build() {
   
        return new House;
    }
};

// 具体的建造者:创建高楼
class HighHouseBuilder : public IHouseBuilder
{
   
public:
    void BuildBase() override {
   
        cout << "高楼:打地基" << endl;
    }
    void BuildWall() override {
   
        cout << "高楼:建墙" << endl;
    }
    void BuildRoof() override {
   
        cout << "高楼:建房顶" << endl;
    }
    House* Build() override {
   
        return new House;
    }
};

// 指挥官
class Director {
   
public:
    void SetBuilder(IHouseBuilder *pBuilder) {
   
        m_pBuilder = pBuilder;
    }

    // 创建产品
    House* Construct() {
   
        m_pBuilder->BuildBase();
        m_pBuilder->BuildWall();
        m_pBuilder->BuildRoof();
        return m_pBuilder->Build();
    }

private:
    IHouseBuilder* m_pBuilder;
};

int main()
{
   
    // 创建盖房子的指挥官
    Director *pDirector = new Director;

    // 具体的建造者
    IHouseBuilder *pCommonHouseBuilder = new CommonHouseBuilder;
    IHouseBuilder *pHighHouseBuilder = new HighHouseBuilder;

    // 盖普通房子
    pDirector->SetBuilder(pCommonHouseBuilder);
    House *pCommonHouse = pDirector->Construct();

    // 盖高楼
    pDirector->SetBuilder(pHighHouseBuilder);
    House *pHighHouse = pDirector->Construct();

    return 0;
}

4、应用场景

建造者模式唯一区别于工厂模式的是针对复杂对象的创建。也就是说,如果创建简单对象,通常都是使用工厂模式进行创建,而如果创建复杂对象,就可以考虑使用建造者模式。

当需要创建的产品具备复杂创建过程时,可以抽取出共性创建过程,然后交由具体实现类自定义创建流程,使得同样的创建行为可以生产出不同的产品,使创建产品的灵活性大大增加。

建造者模式主要适用于以下应用场景:

  • 相同的方法,不同的执行顺序,产生不同的结果
  • 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同
  • 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值

5、建造者模式和工厂模式的区别

建造者模式和工厂模式主要有下面这些区别

  • 建造者模式更加注重方法的调用顺序,工厂模式注重创建对象
  • 创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样
  • 关注重点不一样,工厂模式只需要把对象创建出来就可以了,而建造者模式不仅要创建出对象,还要知道对象由哪些部件组成
  • 建造者模式根据建造过程中的顺序不一样,最终对象部件组成也不一样

相关推荐

  1. 设计模式创建模式---建造模式

    2024-01-11 01:42:02       14 阅读
  2. GO设计模式——5、建造模式创建

    2024-01-11 01:42:02       27 阅读
  3. [设计模式 Go实现] 创建建造模式

    2024-01-11 01:42:02       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-11 01:42:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-11 01:42:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-11 01:42:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-11 01:42:02       20 阅读

热门阅读

  1. #Uniapp:uni-app中vue2生命周期--11个

    2024-01-11 01:42:02       41 阅读
  2. LeetCode每周五题_2024/01/08~01/12

    2024-01-11 01:42:02       66 阅读
  3. 2024.1.8力扣每日一题——回旋镖的数量

    2024-01-11 01:42:02       39 阅读
  4. HDMI2.1 Redriver 信号增强 支持8K60

    2024-01-11 01:42:02       43 阅读
  5. [Microsoft Edge] 如何彻底卸载 Edge

    2024-01-11 01:42:02       34 阅读
  6. 小程序开发之uniapp项目框架搭建

    2024-01-11 01:42:02       43 阅读
  7. VUE +element ui 表格实现数据轮播滚动效果

    2024-01-11 01:42:02       33 阅读
  8. SQL Server 加密 view文本

    2024-01-11 01:42:02       38 阅读
  9. BloomFilter和BitMap的介绍与使用

    2024-01-11 01:42:02       33 阅读
  10. C++系列十六:类与对象

    2024-01-11 01:42:02       38 阅读
  11. python装饰器嵌套基础

    2024-01-11 01:42:02       36 阅读
  12. Linux防火墙相关命令

    2024-01-11 01:42:02       37 阅读