设计模式之生成器方法

news2024/9/28 15:28:57

一、生成器模式概念

Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

简单来说就是封装一个复杂对象的构造过程,并允许按照步骤构造。

  • 对象的创建:Builder模式是为对象的创建而设计的模式
  • 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
  • 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法

适用场景

  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
  • 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

生成器模式的结构

代码及类图如下:

1.构造一个房屋,需要考虑是否有车库,是否有游泳池,是否有地下室,
是否有花园等,需要对诸多成员进行初始化工作。都写在构造函数里?
每种可能都创建一个新的类?2.相同的步骤需要能够产生不同的产品,例如
使用木头和玻璃盖出来的是普通住房。用黄金和水晶建造出来的是宫殿。

解决方案:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
即将对象构造代码从产品中抽取出来,并将其放在一个名为“生成器”的独立对象中。

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

class SimpleHouse
{
public:
    vector<string> m_parts;
    void printParts() const{
        cout << "Parts of the house: ";
        for (const auto& part : m_parts){
            cout << part << " " << endl;
        }
        cout << endl << "----------------" << endl;
    }
};

class Builder
{
public:
    virtual ~Builder() = default;
    virtual void reset() = 0;
    virtual void makeBaseHouse() = 0;
    virtual void makeGarage() = 0;
    virtual void makePool() = 0;
};
//施工队
class SimpleHouseBuilder : public Builder
{
private:
    SimpleHouse* m_simplehouse;
public:
    SimpleHouseBuilder(){
        reset();
    }
    ~SimpleHouseBuilder() override{
        delete m_simplehouse;
    }
    void reset() override{
        m_simplehouse = new SimpleHouse();
    }
    void makeBaseHouse() override{
        m_simplehouse->m_parts.push_back("Base House");
    }
    void makeGarage() override{
        m_simplehouse->m_parts.push_back("Garage");
    }
    void makePool() override{
        m_simplehouse->m_parts.push_back("Swimming Pool");
    }

    SimpleHouse* getResult(){
        SimpleHouse* result = m_simplehouse;
        reset();
        return result;
    }
};

class Director
{
private:
    Builder* m_builder;
public:
    void setBuilder(Builder* builder){
        m_builder = builder;
    }
    void makeSimpleHouse(){
        m_builder->makeBaseHouse();
        m_builder->makeGarage();
        m_builder->makePool();
    }
    void makeFullFuncHouse(){
        m_builder->makeBaseHouse();
        m_builder->makeGarage();
        m_builder->makePool();
    }
};

void client(Director* director)
{
    cout << "客户自己设计流程:" << endl;
    SimpleHouseBuilder* builder = new SimpleHouseBuilder();
    builder->makeBaseHouse();
    builder->makeGarage();
    SimpleHouse* simpleHouse = builder->getResult();
    simpleHouse->printParts();
    

    cout << "客户委托设计师设计流程:" << endl;
    director->setBuilder(builder);
    director->makeSimpleHouse();
    SimpleHouse* simpleHouse2 = builder->getResult();
    simpleHouse2->printParts();
    delete builder;
    delete simpleHouse;
}

int main()
{
    Director director;
    client(&director);
    return 0;
}

二、生成器模式的优缺点

优点:

  • 封装性很好:使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。

  • 扩展性很好:建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。

  • 有效控制细节风险:由于具体的建造者是独立的,因此可以对建造者过程逐步细化,而不对其他的模块产生任何影响。

  • 将复杂对象的创建过程封装起来

  • 允许对象通过几个步骤来创建,并且可以改变过程(工厂模式只有一个步骤)

  • 只需指定具体生成器就能生成特定对象,隐藏类的内部结构

    对象的实现可以被替换

缺点:

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2088996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mudbox 2013/2018简体中文版百度云(附教程)

如大家所了解的&#xff0c;Autodesk Mudbox是一款专业的‌3D数字雕刻和纹理绘画软件‌&#xff0c;它结合了直观的用户界面和一套高性能的创作工具&#xff0c;使三维建模专业人员能够快速轻松地制作高度逼真的有机和无机的三维资产。‌ 目前常用的版本有Mudbox 2013和Mudbox…

微气象在线监测系统:宏观层面的电网灾害预防和应急管理

微气象受局部地形&#xff08;如山谷、河谷&#xff09;、地物&#xff08;如建筑物、森林&#xff09;和地面条件&#xff08;如水面、农田&#xff09;的影响较大&#xff0c;而大范围气象环境则更多地受气候系统和天气模式的控制。输电线路微气象监测的主要目的是为了评估和…

Java基础(6)- Java代码笔记3

目录 一、二维数组 1.二维数组定义 a.动态初始化 b.静态初始化 c.简单静态初始化 2.获取数组长度 二、方法 1.无参无返回值方法 2.有参无返回值方法 3.无参有返回值方法 4.有参有返回值方法 5.形式参数和实际参数 6.三层架构思想 7.方法注意事项 8.数组作为方法参…

如何实现DWG转DXF在线?原来很简单

DWG转DXF在线怎么转&#xff1f;在CAD设计领域&#xff0c;文件格式转换是一项常见且重要的任务。DWG和DXF作为两种广泛使用的CAD文件格式&#xff0c;经常需要在不同软件或平台间进行转换。那么要怎么做才能顺利转换呢&#xff1f;下面&#xff0c;本文将详细介绍三种在线转换…

通过Origin提取图片数据

第一步&#xff1a; Tool --> Digitizer 第二步&#xff1a;点击文件&#xff0c;导入图片 第三步&#xff1a;设置坐标轴位置和数值&#xff08;Edit Aix&#xff09; 滑动鼠标放大图片&#xff0c;将X1移动到0&#xff0c;X2移动到80&#xff0c;Y1移动到97.0&#xff0c…

极客天成分布式全闪存储在大模型训练中的应用

01 国内大语言模型训练使用的存储系统应用现状 近年来&#xff0c;中国在人工智能领域&#xff0c;特别是大语言模型(LLM)的研发和应用方面取得了显著进展。随着百度文心一言、阿里通义千问、讯飞星火等国产大模型的推出&#xff0c;中国AI产业进入了快速发展期。这一趋势带动…

SpringBoot 集成mybatis-plus

目录 前言 简介 前提 运用mybatis-plus&#xff08;使用20241.1版本的idea&#xff09; 1 自动创建springboot项目 1.1 点击新建&#xff0c;SpringBoot 1.2 添加依赖项&#xff0c;点击创建 2添加 MyBatis-Plus Starter 依赖 2.1 打开mybatis-plus官网&#xff0c;点…

适配算能BM1684开发板,bmodel推理模型转换

通过mlir转bmodel 一、文件转移 从算能官网technical center (sophgo.com)下载最新的版本&#xff0c;下载下来之后解压出来&#xff0c;再Ubuntu系统中创建一个sophon文件夹存放后续用到的文件&#xff0c;将tpu-mlir_v1.2.8-g32d7b3ec-20230802.tar.gz文件放入Ubuntu系统中…

《Java面试题集中营》- Redis

建议阅读《Redis开发与运维》《Redis设计与实现》《Redis深度历险&#xff1a;核心原理和应用实践》 Redis 为什么是单线程? 为什么单线程还能这么快&#xff1f; 单线程能够避免线程切换和竞态产生的消耗&#xff0c;而且单线程可以简化数据结构和算法的实现 至于单线程还快…

idea付费插件,SequenceDiagram有哪些优点

以下idea付费插件你们都用过哪些呢&#xff1f; SequenceDiagram插件是一种用于绘制时序图的工具。时序图是一种图形化的表示对象之间消息传递顺序的方法。 该插件可以在使用各种编程语言编写代码时&#xff0c;方便地绘制时序图&#xff0c;以帮助开发者更好地理解和描述系统…

Qt text-align和padding属性

1. text-align属性是用来设置文本的水平对齐方式。 text-align: center 文本将居中显示text-align: left 文本将左对齐显示text-align: right 文本将右对齐显示 2. 内边距padding: 内边距是元素内容与其边框之间的空间 padding-left: 10px; 距离内左边距10个像素点padding-r…

Crypto City盛夏狂欢:Hotcoin推出15,000 USDT迎新礼

在炎炎夏日之际&#xff0c;为了感谢广大用户对Hotcoin平台的支持与热爱&#xff0c;全球领先的数字资产交易平台Hotcoin特别推出了“Crypto City盛夏狂欢”活动。此次活动旨在通过丰厚的奖励迎接新用户&#xff0c;进一步提升用户体验和平台活跃度。 本次活动时间为2024年8月2…

制造企业如何启用BI工具,并构建自助式BI业务模式?

在制造业的数字化转型浪潮中&#xff0c;商业智能BI工具正逐渐成为推动企业增长的“加速引擎”。随着数据量的爆炸性增长&#xff0c;如何高效地分析和利用数据&#xff0c;已成为制造业提升竞争力的关键。本文将基于BI工具在制造业中的优势&#xff0c;深入探讨一种创新的BI分…

SSRF漏洞(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 本文基于pikachu&#xff08;皮卡丘&#xff09;靶场进行SSRF渗透攻击教学。 靶场环境搭建&#xff1a;SSRF漏洞&#xff08;三&#xff09; 一&#xff0c;SSR…

WinForm小技巧之向下复制行和编辑行

WinForm小技巧之向下复制行 文章目录 WinForm小技巧之向下复制行场景代码编辑场景代码 场景 当我点击向下增加行按钮&#xff0c;会在表格中添加一行一摸一样的 代码 按钮点击事件 /// <summary>/// 向下新增/// </summary>/// <param name"sender"…

构建视频生态技术基石:EasyCVR平台如何打破视频流媒体协议壁垒

在快速发展的安防监控和视频流媒体传输领域&#xff0c;EasyCVR平台凭借其在视频流媒体协议上的独特技术优势&#xff0c;逐渐成为业界的佼佼者。本文将详细探讨TSINGSEE青犀视频EasyCVR平台在视频流媒体协议上的几大优势&#xff0c;并展示其在多种应用场景中的广泛应用。 1、…

【IEEE独立出版,快检索 | 高录用】第五届IEEE信息科学与教育国际学术会议(ICISE-IE 2024,12月20-22)

第五届IEEE信息科学与教育国际学术会议(ICISE-IE 2024)定于2024年12月20至22日在中国湛江隆重举行。 ICISE-IE 2024将围绕“信息科学”与"教育”等相关最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一个分享专业…

4个获取设计灵感的优质网站

在设计的世界中&#xff0c;寻找灵感往往是创意迸发的第一步。无论是UI设计师、产品经理&#xff0c;还是自由插画师&#xff0c;找到适合的灵感源是至关重要的。以下介绍4个广受欢迎的设计灵感网站。 1. Dribbble Dribbble是全球领先的设计师社区和展示平台&#xff0c;提供…

4个方法教你高效免费地制作精美思维导图。

思维导图能够将我们的思维以一种图形的形式展现出来&#xff0c;可以帮助我们更好地组织和理解信息&#xff0c;并且能够运用在生活的各个方面。为了让大家都能够便利的制作思维导图&#xff0c;我整理了几个简单好用&#xff0c;还可以免费使用的思维导图工具分享给大家。 1、…

OceanBase 功能解析之 Binlog Service

前言 MySQL&#xff0c;是在全球广泛应用的开源关系型数据库&#xff0c;除了其稳定性、可靠性和易用性&#xff0c;他早期推出的二进制日志功能&#xff0c;即binlog&#xff0c;也是MySQL广受欢迎的原因。 MySQL binlog&#xff0c;即二进制日志&#xff0c;是 MySQL 中用于…