《建造者模式(极简c++)》

本文章属于专栏《设计模式(极简c++版)》


继续上一篇《工厂模式(极简c++)》。本章简要说明建造者模式。本文分为**++模式说明、本质思想、实践建议、代码示例++**四个部分。

模式说明

  • 方案:不同场景对类的构建有不同需求时,使用类提供的构建接口来构建,而不是直接给成员变量赋值
  • 优点:把构建行为,和类的结构分离。增加了代码可扩展性,降低未来维护成本。
  • 缺点:引入了多个额外的类和接口,增加了代码的复杂度。增加了当前维护成本。

本质思想: "类构建过程"和"类的属性、结构、行为"分离。将对象的构建过程拆分成多个步骤,并定义一个抽象接口以及具体的实现类来完成每个步骤。

实践建议: 不使用建造者模式。直到设计、开发时发现,对象的构建过程比较复杂,且在较多场景需要构造,且构造过程不同。个人更偏爱工厂模式来做创建,将类的创建过程封装到一个函数,如果有不同的构建需求,通过输入参数走不同的构建逻辑,如果类的构建十分负责,如构建一个"人",则通过组合的方式,构建多个类(如手脚头等),挂在"人"下面。在生产代码中,我至今还没见到过使用建造者模式的业务代码。这里的本质是大部分场景,"未来降低的维护成本"低于"当前增加的维护成本"

代码示例

cpp 复制代码
#include <iostream>
#include <string>

// 产品类
class Bird {
public:
    void setSpecies(const std::string& species) {
        m_species = species;
    }
    void setColor(const std::string& color) {
        m_color = color;
    }
    void show() {
        std::cout << "Species: " << m_species << std::endl;
        std::cout << "Color: " << m_color << std::endl;
    }
private:
    std::string m_species;
    std::string m_color;
};

// 抽象建造者类
class BirdBuilder {
public:
    virtual void buildSpecies() = 0;
    virtual void buildColor() = 0;
    virtual Bird getResult() = 0;
};

// 具体建造者类
class SparrowBuilder : public BirdBuilder {
public:
    void buildSpecies() override {
        m_bird.setSpecies("Sparrow");
    }
    void buildColor() override {
        m_bird.setColor("Brown");
    }
    Bird getResult() override {
        return m_bird;
    }
private:
    Bird m_bird;
};

// 指导者类
class BirdDirector {
public:
    BirdDirector(BirdBuilder* builder) : m_builder(builder) {}
    void construct() {
        m_builder->buildSpecies();
        m_builder->buildColor();
    }
private:
    BirdBuilder* m_builder;
};

int main() {
    SparrowBuilder builder;
    BirdDirector director(&builder);
    director.construct();

    Bird bird = builder.getResult();
    bird.show();
    // 输出:
    //        Species: Sparrow
    //        Color: Brown

    return 0;
}

下一篇:《单例模式(极简c++)》

相关推荐
可乐鸡翅yeah_11 分钟前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
2601_9622035118 分钟前
Java进阶07集合(续)
java·开发语言
郑州光合科技余经理39 分钟前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
小灰灰搞电子39 分钟前
C++ 引用折叠详解
c++
来了就未晚1 小时前
Python基础 学习代码存储与命名规范
开发语言·python·学习
布莱克6051 小时前
数组详解:定义、作用、应用场景及与链表的区别(C/C++ 代码讲解)
c语言·开发语言·c++·数组
hongmai6668882 小时前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
多弗朗皮卡丘2 小时前
C语言梦开始的地方19:文件操作
c语言·开发语言
Dovis(誓平步青云)2 小时前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
benchmark_cc2 小时前
Python量化实战:如何检测并剔除历史数据中的“闪崩/乌龙指”异常价格点?
开发语言·人工智能·python·量化·quantdash·量化数据源