【设计模式】Head First 设计模式——构建器模式 C++实现

这篇具有很好参考价值的文章主要介绍了【设计模式】Head First 设计模式——构建器模式 C++实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。

设计思想

​ 将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)

动机

在软件系统中,有时候面临着“一个复杂对象” 的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定

如何应对这种变化,如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保证系统中的“稳定构建算法”不随着需求改变而改变?

结构

【设计模式】Head First 设计模式——构建器模式 C++实现,设计模式,设计模式,c++,开发语言,李建忠,构建器

要点总结

Builder 模式主要用于“分步骤构建一个复杂的对象”。在这其中“ 分步骤 ”是一个稳定的算法,而复杂对象的各个部分则经常变化

变化点在哪里,封装就在哪里 — Builder 模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动

在Builder 模式中,要注意不同语言中构造器内调用抽象方法的差别。

业务场景

假如你要建房子,建房子需要打地基,需要买建材垒墙,需要造窗户等等,构造一个“房子”对象似乎并不是一件简单的事情…而现在,需要你用不同建材的材料分别去建房子,这些过程一样,但是材料不一样,该如何设计?

代码案例

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class House
{
public:
    House() {}

    ~House()
    {
        cout << "拆房..." << endl;
    }

    void init()
    {
        build1();
        build2();
        if (build3())
        {
            for (int i = 0; i < 4; i++)
            {
                build4(i);
            }
        }
        build5();
    }

protected:
    virtual void build1() const            = 0;
    virtual void build2() const            = 0;
    virtual bool build3() const            = 0;
    virtual void build4(const int i) const = 0;
    virtual void build5() const            = 0;
};

class storeHouse : public House
{
private:
    virtual void build1() const override
    {
        cout << "用石头打地基..." << endl;
    }
    virtual void build2() const override
    {
        cout << "用石头造房子..." << endl;
    }
    virtual bool build3() const override
    {
        return cout << "通过质检..." << endl, true;
    }
    virtual void build4(const int i) const override
    {
        cout << "造第" << (i + 1) << "扇窗户" << endl;
    }
    virtual void build5() const override
    {
        cout << "石头房子竣工..." << endl;
    }
};

class glassHouse : public House
{
private:
    virtual void build1() const override
    {
        cout << "用玻璃打地基..." << endl;
    }
    virtual void build2() const override
    {
        cout << "用玻璃造房子..." << endl;
    }
    virtual bool build3() const override
    {
        return cout << "通过质检..." << endl, true;
    }
    virtual void build4(const int i) const override
    {
        cout << "造第" << (i + 1) << "扇窗户" << endl;
    }
    virtual void build5() const override
    {
        cout << "玻璃房子竣工..." << endl;
    }
};

class treeHouse : public House
{
private:
    virtual void build1() const override
    {
        cout << "用木头打地基..." << endl;
    }
    virtual void build2() const override
    {
        cout << "用木头造房子..." << endl;
    }
    virtual bool build3() const override
    {
        return cout << "通过质检..." << endl, true;
    }
    virtual void build4(const int i) const override
    {
        cout << "造第" << (i + 1) << "扇窗户" << endl;
    }
    virtual void build5() const override
    {
        cout << "木头房子竣工..." << endl;
    }
};

int main()
{
    std::vector<std::shared_ptr<House>> myHouse;
    myHouse.push_back(make_shared<storeHouse>());
    myHouse.push_back(make_shared<glassHouse>());
    myHouse.push_back(make_shared<treeHouse>());
    for (const auto& item : myHouse)
    {
        item->init();
        cout << "-----------------------------" << endl;
    }

    return 0;
}

这里和之前的模板方法模式很像,但是这里把House中的部分属性忽略了,仅仅暴露出其建造过程,于是,如果采用构建器模式,可以单独把建造过程抽出来:文章来源地址https://www.toymoban.com/news/detail-696855.html

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class House
{
public:
    House() {}

    ~House()
    {
        cout << "拆房..." << endl;
    }

public:
    virtual void build1() const            = 0;
    virtual void build2() const            = 0;
    virtual bool build3() const            = 0;
    virtual void build4(const int i) const = 0;
    virtual void build5() const            = 0;
};

class storeHouse : public House
{
public:
    virtual void build1() const override
    {
        cout << "用石头打地基..." << endl;
    }
    virtual void build2() const override
    {
        cout << "用石头造房子..." << endl;
    }
    virtual bool build3() const override
    {
        return cout << "通过质检..." << endl, true;
    }
    virtual void build4(const int i) const override
    {
        cout << "造第" << (i + 1) << "扇窗户" << endl;
    }
    virtual void build5() const override
    {
        cout << "石头房子竣工..." << endl;
    }
};

class glassHouse : public House
{
public:
    virtual void build1() const override
    {
        cout << "用玻璃打地基..." << endl;
    }
    virtual void build2() const override
    {
        cout << "用玻璃造房子..." << endl;
    }
    virtual bool build3() const override
    {
        return cout << "通过质检..." << endl, true;
    }
    virtual void build4(const int i) const override
    {
        cout << "造第" << (i + 1) << "扇窗户" << endl;
    }
    virtual void build5() const override
    {
        cout << "玻璃房子竣工..." << endl;
    }
};

class treeHouse : public House
{
public:
    virtual void build1() const override
    {
        cout << "用木头打地基..." << endl;
    }
    virtual void build2() const override
    {
        cout << "用木头造房子..." << endl;
    }
    virtual bool build3() const override
    {
        return cout << "通过质检..." << endl, true;
    }
    virtual void build4(const int i) const override
    {
        cout << "造第" << (i + 1) << "扇窗户" << endl;
    }
    virtual void build5() const override
    {
        cout << "木头房子竣工..." << endl;
    }
};

class HouseBuilder
{
    private:
    std::shared_ptr<House> _house;
    public:
    HouseBuilder(const std::shared_ptr<House>& _house): _house(_house){}

    void init()
    {
        _house->build1();
        _house->build2();
        if (_house->build3())
        {
            for (int i = 0; i < 4; i++)
            {
                _house->build4(i);
            }
        }
        _house->build5();
    }
};

int main()
{
    std::vector<std::shared_ptr<HouseBuilder>> myHouse;
    myHouse.push_back(make_shared<HouseBuilder>(make_shared<storeHouse>()));
    myHouse.push_back(make_shared<HouseBuilder>(make_shared<glassHouse>()));
    myHouse.push_back(make_shared<HouseBuilder>(make_shared<treeHouse>()));
    for (const auto& item : myHouse)
    {
        item->init();
        cout << "-----------------------------" << endl;
    }
    return 0;
}

到了这里,关于【设计模式】Head First 设计模式——构建器模式 C++实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式】Head First 设计模式——观察者模式 C++实现

    设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。 主题对象(出版者)管理某些数据,当主题内的数据改变,就会通知观察者(订阅者)。

    2024年02月10日
    浏览(42)
  • 【Head First 设计模式】-- 观察者模式

    客户有一个WeatherData对象,负责追踪温度、湿度和气压等数据。现在客户给我们提了个需求,让我们利用WeatherData对象取得数据,并更新三个布告板:目前状况、气象统计和天气预报。 WeatherData对象提供了4个接口: getTemperature():获取温度 getHumidity():获取湿度 getPressure():获

    2024年02月05日
    浏览(46)
  • 设计模式之构建器(Builder)C++实现

    在软件功能开发中,有时面临“一个复杂对象”的创建工作,该对象的每个功能接口由于需求的变化,会使每个功能接口发生变化,但是该对象使用每个功能实现一个接口的流程是稳定的。构建器就是解决该类现象的。构建就是定义一个抽象类,然后将变化的每个功能接口定

    2024年02月12日
    浏览(40)
  • (十三)Head first design patterns原型模式(c++)

    原型模式就是就是对对象的克隆。有一些私有变量外界难以访问,而原型模式可以做到对原型一比一的复刻。 其关键代码为下面的clone方法。此方法将本对象进行复制传递出去。 C++设计模式(10)——原型模式_c++原型模式-CSDN博客

    2024年01月23日
    浏览(38)
  • (十)Head first design patterns组合模式(c++)

    组合模式在参考链接中已经讲得很好了,这里只简单讲讲就好。 组合模式的意图是表达部分-整体层次结构。 当你需要管理一个组合对象,又要管理这个组合对象的单个对象。这个时候就可以让这个组合对象和单个对象继承同一个基类,以便用基类指针做统一管理。 当基类指

    2024年01月23日
    浏览(39)
  • (十二)Head first design patterns代理模式(c++)

    代理模式:创建一个proxy对象,并为这个对象提供替身或者占位符以对这个对象进行控制。 典型例子:智能指针... 例子:比如说有一个talk接口,所有的people需要实现talk接口。但有些人有唱歌技能。不能在talk接口中实现sing功能,又不能在所有的people中实现sing功能。于是可以

    2024年01月23日
    浏览(35)
  • (十一)Head first design patterns状态模式(c++)

    如何去描述状态机? 假设你需要实例化一台电梯,并模仿出电梯的四个状态:开启、关闭、运行、停止。也许你会这么写 这样写未免太草率了。因为电梯在门开启的时候一般是不能运行的,在运行的时候一般也不会门开启,而在停止工作状态一般不会再去执行关门这个动作

    2024年01月23日
    浏览(34)
  • (十四)Head first design patterns建造者模式(c++)

    建造者把产品细节的实现过程单独封装成类,完成产品本身和创建产品之间的解耦。每一个建造者都相对独立,因此在建造细节实现方面实现了灵活性和可扩展性。 建造者模式和工厂模式的区别:工厂模式关心把这个产品创建出来,而不关心其细节;建造者模式不仅需要把产

    2024年01月24日
    浏览(36)
  • 设计模式:命令模式(C++实现)

    命令模式(Command Pattern)是一种行为设计模式,它将请求封装成一个对象,从而使您可以使用不同的请求对客户端进行参数化。这使得客户端可以独立于具体的请求和接收者对请求进行操作。 以下是一个简单的C++命令模式的示例: 在上述示例中,Command是命令的基类,定义了

    2024年02月07日
    浏览(40)
  • 设计模式:访问者模式(C++实现)

    访问者模式通过将对元素的操作与元素本身分离,使得可以在不修改元素类的情况下定义新的操作。 运行结果: 在上述代码中,Visitor是访问者接口,定义了访问具体元素的方法。Element是元素接口,定义了接受访问者访问的方法。ConcreteElementA和ConcreteElementB是具体元素类,实

    2024年02月07日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包