【C++】设计模式之——建造者

建造者模式

首先先大体了解一下,建造者模式是什么意思,它是怎么实现的?

  • 首先,建造者模式是一种创建型设计模式
  • 再一个它是使用多个简单的对象一步一步的搭建出一个复杂的对象
  • 它可以将一个复杂的对象进行构建分离,提供一种创建对象的最佳方式。

建造者模式主要用于构建复杂问题

概念

建造者模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

模拟实现建造者模式

建造者模式主要基于四个核⼼类实现:

  • 抽象产品类:
  • 具体产品类:⼀个具体的产品对象类
  • 抽象Builder类:创建⼀个产品对象所需的各个部件的抽象接⼝
  • 具体产品的Builder类:实现抽象接⼝,构建各个部件
  • 指挥者Director类:统⼀组建过程,提供给调⽤者使⽤,通过指挥者来构造产品

思维导图

代码实现
cpp 复制代码
#include <iostream>
#include <string>
#include <memory>

//构建电脑需要的零件
class Computer
{

public:
    Computer(){}

    void setBoard(const std::string &board)
    {
        _board = board;
    }
    void setDisplay(const std::string &display)
    {
        _display = display;
    }

    void showParamaters()//最终终端输出
    {
        std::string param = "Computer Paramaters:\n";
        param += "\tBoard:"+_board + "\n";
        param += "\tDisplay:"+_display + "\n";
        param += "\tOs:"+_os + "\n";
        std::cout << param << std::endl;
    }

    virtual void setOs() = 0;//纯虚函数

protected:
    std::string _board;//主板
    std::string _display;//显示器
    std::string _os;//操作系统
};

class MacBook :public Computer
{
public:

    void setOs()override
    {
        _os = "Mac OS X12";
    }
};

class Builder
{
public:
    virtual void buildBoard(const std::string &board) = 0;//纯虚函数
    virtual void buildDisplay(const std::string &display) = 0;
    virtual void buildOs() = 0;
    virtual std::shared_ptr<Computer> build() = 0;//定义了一个Computer智能指针对象
};

class MacBookBuilder : public Builder
{
public:
    MacBookBuilder():_computer(new MacBook()){}
    void buildBoard(const std::string& board)
    {
        _computer->setBoard(board);
    }

    void buildDisplay(const std::string& display)
    {
        _computer->setDisplay(display);
    }

    void buildOs()
    {
        _computer->setOs();
    }

    std::shared_ptr<Computer> build()
    {
        return _computer;
    }
private:
    std::shared_ptr<Computer> _computer;
};

//指导者
class Director
{
public:
    Director(Builder* builder):_builder(builder){}
    void construct(const std::string &board,const std::string &display)
    {
        _builder->buildBoard(board);
        _builder->buildDisplay(display);
        _builder->buildOs();
    }
private:
    std::shared_ptr<Builder> _builder;
};


int main()
{
    Builder *builder = new MacBookBuilder();
    std::unique_ptr<Director> director(new Director(builder));
    director->construct("华硕主板","三星显示器");

    std::shared_ptr<Computer> computer = builder->build();
    computer->showParamaters();
    return 0;

}
相关推荐
stein_java19 分钟前
springMVC-10验证及国际化
java·spring
weixin_4786897622 分钟前
C++ 对 C 的兼容性
java·c语言·c++
k要开心27 分钟前
C++概念以及基础框架语法
开发语言·c++
weixin_307779131 小时前
Linux下GCC和C++实现统计Clickhouse数据仓库指定表中各字段的空值、空字符串或零值比例
linux·运维·c++·数据仓库·clickhouse
LUCIAZZZ1 小时前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
胡侃有料1 小时前
【设计模式】1.简单工厂、工厂、抽象工厂模式
设计模式·抽象工厂模式
sky_ph1 小时前
JAVA-GC浅析(二)G1(Garbage First)回收器
java·后端
IDRSolutions_CN2 小时前
PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第二部分)
java·经验分享·pdf·软件工程·团队开发
hello早上好2 小时前
Spring不同类型的ApplicationContext的创建方式
java·后端·架构
秦少游在淮海2 小时前
C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
开发语言·c++·stl·string·范围for·auto·string 的使用