生成器建造者模式(Builder)——创建型模式

news2025/1/17 14:00:57

生成器/建造者模式——创建型模式

什么是生成器模式?

生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。

提炼两个关键点:Ⅰ.分步骤创建复杂对象。Ⅱ.相同创建代码创建不同类型和形式的对象。

Ⅰ.分步骤创建复杂对象:

假设有一个产品类,这个产品有100个非静态成员属性,为了保证程序的健壮性,我们要在构造函数中对这100个属性进行init。此时构造函数"又大又长"不说,我们在调用时还要逐一去找准参数顺序,并且如果想设置一些默认值,还要去重载构造函数设置缺省参数,真的是极其复杂。

生成器模式就是把创建的行为抽象出来,抽象出两个类,分别是生成器(builder)和主管(director)。

生成器(builder):生成器类中依赖于某个产品(产品加工器),内部包含一个产品实体,并实现了"一堆"set方法用于设置产品属性字段,并对外**提供getproduct()**方法。

主管(director): 主管类中实现的是产品的参数设置方法(相当于人拿着产品参数说明书)。主管有很多说明书(idea),面对同一个生成器,设置参数不同,构造出的产品就不同。也就是说操作生成器的动作在主管类的成员方法中

总结:在CodeClient中,我们只需要定义一个生成器和一个主管,就可以根据主管的不同想法操作同一个生成器生成不同参数的产品。又因为对每个字段设置的操作都实现成独立的方法,所以我们需要考虑设置顺序,需要哪个调用哪个即可。

Ⅱ.相同创建代码创建不同类型和形式的对象:

简单来说,主管的某一个想法,可以作用到不同的生成器上。比如说主管类根据自己的产品参数说明书操作汽车生成器,来生成一台汽车。那同样可以用这个产品参数说明书操作汽车手册生成器,生成一个汽车手册对象。因为对于手册和汽车实体,字段几何都是一样的,比如说几个座位、几个门、是否有GPS…,只不过字段类型可能不同。

用C++实现一个例子:

在这里插入图片描述

/*************************************************************************
        > File Name: builder.cpp
        > Author:
        > Mail:
        > Created Time: Tue Mar 12 10:54:06 2024
 ************************************************************************/

#include <iostream>
#include <cstring>
using namespace std;

class Car {
public:
    int seatnum;
    int doornum;
    bool GPS;
};

class Manual {
public:
    string seatnum;
    string doornum;
    string GPS;
};

class Builder {
public:
    virtual void setSeats(int) = 0;
    virtual void setDoors(int) = 0;
    virtual void setGPS(bool) = 0;
};

class CarBuilder : public Builder {
private:
    Car car;
public:
    void setSeats(int num) override {
        car.seatnum = num;
    }
    void setDoors(int num) override {
        car.doornum = num;
    }
    void setGPS(bool is) override {
        car.GPS = is;
    }
    Car getCarIns() {
        return car;
    }
};

class ManualBuilder : public Builder {
private:
    Manual manual;
public:
    void setSeats(int num) override {
        manual.seatnum = "This car has " + to_string(num) + " seat.";
    }
    void setDoors(int num) override {
        manual.doornum = "This car has " + to_string(num) + " door.";
    }
    void setGPS(bool is) override {
        if (is)  manual.GPS = "Support GPS";
        else manual.GPS = "No support GPS";
    }
    Manual getManualIns() {
        return manual;
    }
};

class Director {
public:
    void makeSUV(Builder &builder) {
        builder.setSeats(4);
        builder.setDoors(4);
        builder.setGPS(true);
    }
    void makeSports(Builder &builder) {
        builder.setSeats(2);
        builder.setDoors(2);
        builder.setGPS(false);
    }
};

void CodeClient() {
    Director director;

    CarBuilder carbuilder;
    director.makeSUV(carbuilder);
    Car car = carbuilder.getCarIns();
    cout << car.seatnum << endl << car.doornum << endl << car.GPS << endl;

    ManualBuilder manualbuilder;
    director.makeSports(manualbuilder);
    Manual manual = manualbuilder.getManualIns();
    cout << manual.seatnum << endl << manual.doornum << endl << manual.GPS << endl;

    return ;
}

int main() {
    CodeClient();
    return 0;
}

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

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

相关文章

linux-MDK can电机带导轨

确保接线正确&#xff0c;这个带导轨的电机需要24V的电压 $ ls /dev //查看端口是什么$ sudo slcand -o -s6 /dev/ttyACM0 can0 //将端口封装为can0 $ sudo ip link set can0 up //打开端口 按照电机说明书&#xff0c;按照需要的指令计算检验和&#xf…

30天学会QT(进阶)--------------第二天(创建项目)

1、如何规范的创建一个项目 由于本人也是从其他的项目上学来的&#xff0c;所以也不算是业界规范&#xff0c;每个公司或者个人都有自己的方式去创建项目&#xff0c;项目的创建是本着简洁&#xff0c;明了&#xff0c;方便而言的&#xff0c;所以对于我来说&#xff0c;不繁琐…

速卖通批量注册买家号安全吗?怎么弄?

在速卖通等跨境电商平台上&#xff0c;买家号的注册与养号过程繁琐而复杂。传统的手动注册方式效率低下&#xff0c;难以满足大规模的需求。而跨境智星系统凭借其全自动化的功能&#xff0c;能够轻松实现买家号的批量注册与养号&#xff0c;大大提高了效率。 使用跨境智星系统进…

计算机基础:一些你必须知道的名词详解,必须要会的理论知识

软件测试 计算机基本特点 计算机硬件组成 内存储器和外存储器特点 计算机软件系统组成 常见的操作系统软件 编码 计算机数据计量单位 浏览器 图片类型 网页打开过程 客户端、服务器、请求和响应 dos 命令 软件测试 在规定的条件下对程序进行操作&#xff0c;以发现…

海豚调度系列之:认识海豚调度

海豚调度系列之&#xff1a;认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过…

MySQL row_number()函数,rank()函数和dense_rank()函数

从MySQL8.0开始引用row_number(), rank()函数和dense_rank()函数&#xff0c;也就是常见的窗口函数&#xff0c;三个函数都是一种用于计算排名的工具&#xff0c;它们根据指定的列对结果集进行排序&#xff0c;并为每一行分配一个排名值&#xff08;1,2,3,...&#xff09;。 函…

【ansible】ansible的介绍和安装

前言运维自动化 云计算核心职能 搭建平台架构 日常运营保障 性能效率优化 相关工具 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubVersion 构建工具&#xff1a;maven、Ant、Gradle 自动部署&#xff1a;Capistrano、CodeDeploy 持续…

insertAdjacentHTML() 作用

insertAdjacentHTML()简介 insertAdjacentHTML() 方法是将文本解析为 element 元素&#xff0c;并将结果节点插入到DOM树中的指定位置。它不会重新解析它正在使用的元素&#xff0c;因此它不会破坏元素内的现有元素。这避免了额外的序列化步骤&#xff0c;使其比直接使用innerH…

京东|淘宝电商API数据采集接口C++/JAVA/python软件API接口调试

多语言环境下API接口的调用&#xff0c;是很多电商企业都要求的。 如何接入京东/淘宝API接口&#xff0c;如何请求&#xff1f; taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_na…

微信小程序上传图片到服务端,springboot项目。避免踩坑保姆教程

多方查找终于搞懂了如何去上传文件到本地服务器 前端代码 <view class"operation_row common_mb0"><view class"upload_btn" bindtap"clickUpload"><image src"../../common/images/icon/icon02.png"></image&g…

Docker 搭建 PaddleOCR

转自PaddleOCR docker模式 - 简书 目的: 公司要放弃第三方的ocr工具(日语),需要自己搭建训练一套,这篇是搭建 图片要标出文字的选取框 因为是日文所以ocr有专门的工具,只需要文字坐标就好如图 日文的账票需要加密一下 我得环境是 Ubuntu 22.04.1 LTS 1,下载代码 cd /hom…

智能商品管理系统:驱动零售盈利型的数据利器

在数字化浪潮席卷全球的今天&#xff0c;零售业正面临着前所未有的变革。智能商品管理系统作为零售业的“数据利器”&#xff0c;正在以其强大的数据分析能力和智能化的管理手段&#xff0c;助力零售企业实现盈利增长和业务创新。 智能商品管理系统通过集成大数据、云计算、人…

微机综合保护测控装置在某电厂10.5kV厂用电系统改造中的应用

彭姝麟 Acrelpsl 0 引言 某电厂8号机组10.5kV厂用电系统分为两段&#xff0c;即V、VI段。正常工况下V、VI段分段运行&#xff0c;即联络断路器060处于断开位。V段由8GB经051断路器供电&#xff0c;同时还可由IV段047断路器供电&#xff08;紧急备用电源&#xff09;&#xff0…

3、设计模式之工厂模式2(Factory)

一、什么是工厂模式 工厂模式属于创建型设计模式&#xff0c;它用于解耦对象的创建和使用。通常情况下&#xff0c;我们创建对象时需要使用new操作符&#xff0c;但是使用new操作符创建对象会使代码具有耦合性。工厂模式通过提供一个公共的接口&#xff0c;使得我们可以在不暴露…

管理application的secret,在哪个level呢

从安全设计来看&#xff0c;访问控制是非常重要的。除非是完全公开的网页&#xff0c;可以没有任何限制的访问 在实施访问控制的应用application中呢&#xff0c;你的秘钥管理控制在哪个level呢 level -2 没有访问控制&#xff0c;注意这是-2 负二&#xff0c;不是level 2 l…

Python编程从入门到实践中的一些误区

1.num 使用num时python报错&#xff0c;后来查过后才知道是因为python不支持自增或自减&#xff0c;可以用1。 2.字符串和非字符串连接 要先将非字符串转换为字符串类型之后才能连接 print&#xff08;2int&#xff08;‘2’&#xff09;&#xff09;#4 3.关键字参数必须在未…

白酒:生产过程的智能化与自动化升级改造

在当今的工业生产中&#xff0c;智能化与自动化已成为提进一步率、品质和竞争力的关键因素。云仓酒庄紧跟时代步伐&#xff0c;对豪迈白酒的生产过程进行了一系列智能化与自动化升级改造&#xff0c;旨在提升生产效率、确保产品质量的同时&#xff0c;降低生产成本。 首先&…

计算机网络-第7章 网络安全(1)

主要内容&#xff1a;安全威胁与问题、对称密钥密码体制和公钥密码体制、数字签名与鉴别、网络层和运输层安全协议、应用层电子邮件、系统安全&#xff1a;防火墙与入侵检测 当网络中的用户都来自社会各个阶层和部门时&#xff0c;网络中存储和传输的数据需要保护。 7.1 网络安…

​如何使用 ArcGIS Pro 分析爆炸波及建筑

假设在某栋建筑内发生了爆炸&#xff0c;需要根据爆炸的范围分析出来波及的建筑&#xff0c;对于这一需求&#xff0c;我们可以通过ArcGIS Pro来实现&#xff0c;这里为大家介绍一下分析的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…

使用DateUtil工具类偏移日期

使用DateUtil工具类偏移日期 一、依赖二、源码三、示例代码 一、依赖 <!--工具依赖--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>二、源码 …