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

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

什么是生成器模式?

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

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

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

假设有一个产品类,这个产品有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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

北斗卫星在桥隧坡安全监测领域的应用及前景展望

北斗卫星在桥隧坡安全监测领域的应用及前景展望 北斗卫星系统是中国独立研发的卫星导航定位系统&#xff0c;具有全球覆盖、高精度定位和海量数据传输等优势。随着卫星导航技术的快速发展&#xff0c;北斗卫星在桥隧坡安全监测领域正发挥着重要的作用&#xff0c;并为相关领域…

python 目录和文件基本操作

目录操作 获取当前目录&#xff1a; import os dir_path os.getcwd() print("当前目录&#xff1a;", dir_path) 当前目录&#xff1a; D:\work\pycharm\object 创建目录&#xff1a; import osdir_path os.getcwd() print("当前目录&#xff1a;", d…

【算法刷题 | 栈】3.16(有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值)

文章目录 1.有效的括号1.1题目1.2解法&#xff1a;栈 2.删除字符串中的所有相邻重复项2.1题目2.2解法&#xff1a;栈 3.逆波兰表达式求值3.1题目3.2解法&#xff1a;栈 1.有效的括号 1.1题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff…

Midjourney绘图欣赏系列(十二)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

element ui 中文离线文档(百度云盘下载)

一般内网开发上不了网&#xff0c;用离线版本比较方便&#xff0c;下载地址&#xff1a; https://download.csdn.net/download/li836779537/88355878?spm1001.2014.3001.5503 下载后里面有个 index.hrml 双击打开就可以用 效果如下&#xff1a;

ADC架构III:Σ-Δ型ADC基础

简介 Σ-Δ型ADC是现代语音频带、音频和高分辨率精密工业测量应用所青睐的转换器。高度数 字架构非常适合现代细线CMOS工艺&#xff0c;因而允许轻松添加数字功能&#xff0c;而又不会显著增加成 本。随着此转换器架构的广泛使用&#xff0c;了解其基本原理显得非常重要。 历…

河南大学大数据平台技术实验报告二

大数据平台技术课程实验报告 实验二&#xff1a;HDFS操作实践 姓名&#xff1a;杨馥瑞 学号&#xff1a;2212080042 专业&#xff1a;数据科学与大数据技术 年级&#xff1a;2022级 主讲教师&#xff1a;林英豪 实验时间&#xff1a;2024年3月15日3点 至 2024年3月15日4点40 …

C#,入门教程(27)——应用程序(Application)的基础知识

上一篇: C#,入门教程(26)——数据的基本概念与使用方法https://blog.csdn.net/beijinghorn/article/details/124952589 一、什么是应用程序 Application? 应用程序是编程的结果。一般把代码经过编译(等)过程,最终形成的可执行 或 可再用 的文件称为应用程序。可执行文…

数据结构之顺序表(包学包会版)

目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 3.总结 halo&#xff0c;又和大家见面了&#xff0c;今天要给大家分享的是顺序表的知识&#xff0c;跟着我的脚步&#xff0c;包学包会哦~ 规矩不乱&#xff0c;先赞后看&#xff01; ps&#xff1a;&#xff08;孙权…

Android的三种动画详解(帧动画,View动画,属性动画)

Android的三种动画详解&#xff08;帧动画、View动画、属性动画&#xff09;_android动画效果大全-CSDN博客 1、帧动画 缺点是&#xff1a;占用内存较高&#xff0c;播放的是一帧一帧的图片&#xff0c;很少使用。 顺序播放预先定义的图片&#xff0c;类似于播放视频。 步骤…

MySQL语法分类 DDL

DDL(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所有数据库的名称 show datab…

基于ElasticSearch存储海量AIS数据:时空立方体索引篇

文章目录 引言I 时间维切分II 空间范围切分引言 索引结构制约着查询请求的类型和处理方式,索引整体架构制约着查询请求的处理效率。随着时间推移,AIS数据在空间分布上具备局部聚集性,如 果简单地将所有AIS数据插入一个索引结构,随着数据量增长,索引的更新效率、查询效率及…

8508A福禄克(FLUKE)数字多用表

181/2461/8938产品概述&#xff1a; Fluke 8508A 万用表在广泛的测量范围内具有卓越的准确性和稳定性&#xff0c;旨在用作校准实验室的多功能精密测量工具&#xff0c;这些实验室必须满足日益严格的测量不确定性分析要求以及提高生产率的需要。 作为其复杂职责的一部分&…

前端项目,个人笔记(一)【Vue-cli - 定制化主题 + 路由设计】

目录 1、项目准备 1.1、项目初始化 1.2、elementPlus按需引入 注&#xff1a;使用cnpm安装elementplus及两个插件&#xff0c;会报错&#xff1a;vueelement-plus报错TypeError: Cannot read properties of null (reading isCE ) &#xff0c;修改&#xff1a; 测试&#…

SSO 单点登录

什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用间传输声明。它以一种紧凑且自包含的方式安全地在用户和服务之间传递信息&#xff0c;通常用于身份验证和信息交换 为什么要使用JWT 1.传统Se…

解密学习机制:线性回归与梯度下降之旅

摘要 在理解机器学习机制的过程中&#xff0c;我们探讨了在合成数据集上训练简单线性回归模型的过程。整个过程要解决的问题是算法如何通过迭代优化来学习输入和输出变量之间的基本关系。 我们的方法包括生成一个合成线性数据集&#xff0c;实施梯度下降进行参数估计&#xf…

Sonarqube中Java规则与CWE与OWASP的映射关系

很多企业使用Sonarqube社区版作为静态分析工具&#xff0c;在开发阶段检测代码中的缺陷或安全漏洞。但是如果是作为SAST工具厂商&#xff0c;集成该引擎&#xff0c;则需要把Sonarqube中的检测规则与其它引擎的规则进行整合&#xff0c;例如下图&#xff0c;把Sonarqube中的一些…

Spring Cloud Alibaba微服务从入门到进阶(三)(Spring Cloud Alibaba)

Spring Cloud Alibaba是spring Cloud的子项目 Spring Cloud Alibaba的主要组件&#xff08;红框内是开源的&#xff09; Spring Cloud是快速构建分布式系统的工具集&#xff0c; Spring Cloud提供了很多分布式功能 Spring Cloud常用子项目 项目整合 Spring Cloud Alibaba …

Java项目:56 ssm681基于Java的超市管理系统+jsp

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 功能包括:商品分类&#xff0c;供货商管理&#xff0c;库存管理&#xff0c;销售统计&#xff0c;用户及角色管理&#xff0c;等等功能。项目采用mave…

【考研数学】高等数学总结

文章目录 第一章 极限 函数 连续1.1 极限存在准则及两个重要极限1.1.1 夹逼定理1.1.1.1 数列夹逼定理1.1.1.2函数夹逼定理 1.1.2 两个重要极限1.1.2.1 极限公式11.1.2.1.1 证明1.1.2.1.2 数列的单调有界收敛准则1.1.2.1.2.1 二项式定理1.1.2.1.2.2 证明 1.1.2.2 极限公式21.1.2…