【软考】设计模式之生成器模式

news2024/9/21 4:37:16

目录

          • 1. 说明
          • 2. 应用场景
          • 3. 结构图
          • 4. 构成
          • 5. 适用性
          • 6. 优点
          • 7. 缺点
          • 8. java示例

1. 说明
  • 1.生成器模式(Builder Pattern),也称为建造者模式,是设计模式中的一种创建型模式
  • 2.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 3.它主要用于构建复杂对象,通过将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。
  • 4.
2. 应用场景
  • 1.当一个类的构造函数包含多个参数,或者这些参数是相互依赖的,或者创建对象的步骤很多时,使用生成器模式可以简化对象的创建过程
  • 2.当创建的复杂对象内部状态之间的变化相互依赖时,使用生成器模式可以更加灵活地构建对象。
  • 3.当一个对象需要被构建成不同的表示时,使用生成器模式可以轻松地通过不同的生成器来创建不同的表示。
3. 结构图

在这里插入图片描述

4. 构成
  • 1.抽象生成器(Builder)角色:为创建一个Product对象的各个部件指定抽象接口。
  • 2.具体生成器(Concrete Builder)角色:实现 Builder 的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。
  • 3.指挥者(Director)角色(可选):构造一个使用 Builder 接口的对象。负责安排已有模块的顺序,然后告诉Builder开始构建。
  • 4.产品(Product)角色:表示被构建的复杂对象。它包含多个组成部件的声明,如汽车的轮子、引擎和车身等。
5. 适用性
  • 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 2.当构造过程必须允许被构造的对象有不同的表示时。
  • 3.当一个类的构造函数包含多个参数,或者这些参数是相互依赖的,或者创建对象的步骤很多时,使用生成器模式可以简化对象的创建过程。
  • 4.当创建的复杂对象内部状态之间的变化相互依赖时,使用生成器模式可以更加灵活地构建对象。
  • 5.当一个对象需要被构建成不同的表示时,使用生成器模式可以轻松地通过不同的生成器来创建不同的表示。
6. 优点
  • 1.封装性:生成器模式封装了复杂对象的创建过程,使得客户端代码更加简洁。
  • 2.灵活性:通过提供不同的生成器,可以创建不同的对象,而无需修改现有的构建代码。
  • 3.可维护性:由于构建过程被分离出来,因此更容易理解和维护。
  • 4.可扩展性:能够轻松地扩展新类型的对象,而无需修改现有的代码结构。
7. 缺点
  • 1.造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
8. java示例
public class Person {  
    private String name;  
    private int age;  
    private String email;  
  
    // 私有构造函数,防止外部直接实例化  
    private Person(PersonBuilder builder) {  
        this.name = builder.name;  
        this.age = builder.age;  
        this.email = builder.email;  
    }  
  
    // Getter方法  
    public String getName() {  
        return name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public String getEmail() {  
        return email;  
    }  
  
    // Builder内部类  
    public static class PersonBuilder {  
        private String name;  
        private int age;  
        private String email;  
  
        // 链式方法设置属性  
        public PersonBuilder withName(String name) {  
            this.name = name;  
            return this;  
        }  
  
        public PersonBuilder withAge(int age) {  
            this.age = age;  
            return this;  
        }  
  
        public PersonBuilder withEmail(String email) {  
            this.email = email;  
            return this;  
        }  
  
        // 构建Person对象  
        public Person build() {  
            return new Person(this);  
        }  
    }  
  
    // 为了方便使用,提供一个静态方法返回PersonBuilder实例  
    public static PersonBuilder builder() {  
        return new PersonBuilder();  
    }  
}
public class BuilderPatternDemo {  
    public static void main(String[] args) {  
        Person person = Person.builder()  
                .withName("John Doe")  
                .withAge(30)  
                .withEmail("johndoe@example.com")  
                .build();  
  
        System.out.println("Name: " + person.getName());  
        System.out.println("Age: " + person.getAge());  
        System.out.println("Email: " + person.getEmail());  
    }  
}

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

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

相关文章

C++初学(2)

2.1、其他简单C语句例子 下面这个程序要求运行时输入值 #include <iostream> int main() {using namespace std;int yuanshi;cout << "How many yuanshi do you have?" << endl;cin >> yuanshi;cout << "Here are two more.&q…

数据结构——堆(C语言版)

树 树的概念&#xff1a; 树&#xff08;Tree&#xff09;是一种抽象数据结构&#xff0c;它由节点&#xff08;node&#xff09;的集合组成&#xff0c;这些节点通过边相连&#xff0c;把 节点集合按照逻辑顺序抽象成图像&#xff0c;看起来就像一个倒挂着的树&#xff0c;也…

15 Python常用内置函数——类型转换与类型判断

① 内置函数 bin()、oct()、hex() 用来将整数转换为二进制、八进制和十六进制形式&#xff0c;这3个函数都要求参数必须为整数。 print((bin(168), oct(168), hex(168))) # 把数字转换为二进制串、八进制串、十六进制串内置函数 int() 用来将其他形式的数字转换为整数&#x…

【计算机网络】HTTP协议实验

一&#xff1a;实验目的 1&#xff1a;理解HTTP协议的基本工作原理。 2&#xff1a;使用Wireshark或其他抓包工具捕获并分析HTTP数据包&#xff0c;理解HTTP通信的具体过程。 3&#xff1a;通过分析抓包数据&#xff0c;识别常见的HTTP状态码及其含义。 二&#xff1a;实验仪…

华为OD机试 - 数的分解 (Java/c++/python 2024年C卷D卷)

华为OD机试&#xff08;C卷D卷&#xff09;2024真题目录(Java & c & python) 题目描述 给定一个正整数 n&#xff0c;如果能够分解为 m&#xff08;m > 1&#xff09;个连续正整数之和&#xff0c;请输出所有分解中&#xff0c;m最小的分解。 如果给定整数无法分…

Linux中的三类读写函数

文件IO和标准IO的区别 遵循标准&#xff1a; 文件IO遵循POSIX标准&#xff0c;主要在类UNIX环境下使用。标准IO遵循ANSI标准&#xff0c;具有更好的可移植性&#xff0c;可以在不同的操作系统上重新编译后运行。可移植性&#xff1a; 文件IO的可移植性相对较差&#xff0c;因为…

从丢失到找回:2024年U盘数据恢复软件全攻略

优盘作为我们日常短时间存储分享数据来说非常方便&#xff0c;毕竟小巧便携。但是也正因为他小巧数据很容易丢失&#xff0c;如果有备份还好&#xff0c;没有备份就麻烦了。但是只要掌握U盘数据恢复方法就可以缩小我们的损失。 1.福foxit昕数据恢复工具 一键直达>>http…

【ESP32 idf 硬件I2C驱动MPU6050获取六轴数值】

目录 I2C介绍配置安装驱动通信创建&删除命令链接容器起始时序写数据读数据结束时序开始命令 mpu6050 硬件i2c驱动代码&调试代码调试 I2C 介绍 介绍部分可以看我写的【ESP32 idf 软件模拟I2C驱动MPU6050实现六轴加速度的获取】&#xff0c;这个是使用软件模拟的I2C时序…

数据结构-C语言-排序(4)

代码位置&#xff1a; test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 1.1-排序定义&#xff1a; 排序就是将一组杂乱无章的数据按照一定的规律&#xff08;升序或降序&#xff09;组织起来。(注&#xff1a;我们这里的排序采用的都为升序) 1.2-排…

找工作准备刷题Day10 回溯算法 (卡尔41期训练营 7.24)

回溯算法今天这几个题目做过&#xff0c;晚上有面试&#xff0c;今天水一水。 第一题&#xff1a;Leetcode77. 组合 题目描述 解题思路 从题目示例来看&#xff0c;k个数是不能重合的&#xff0c;但是题目没有明确说明这一点。 使用回溯算法解决此问题&#xff0c;利用树形…

设计模式-结构型-09-外观模式

文章目录 1、影院管理项目2、外观模式基本介绍4、MyBatis 框架源码分析5、外观模式总结 1、影院管理项目 组建一个家庭影院&#xff1a; DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机&#xff0c;要求完成使用家庭影院的功能&#xff0c;其过程为&#xff1a; 直接用…

推荐一个酷炫高逼格的服务器探针的监控工具,免费开源(附源码)

背景 作为一名攻城狮&#xff0c;面对各种服务器内存飙高、CPU猛增、磁盘打满等等服务器问题&#xff0c;可谓是伤透了我们的心。 不仅要开发&#xff0c;还要处理这些问题&#xff0c;大把的时间浪费了&#xff0c;这时候一个好的全面的监控工具尤为重要了。 所以&#xff…

Spring AI (三) 提示词对象Prompt

3.提示词对象Prompt 3.1.Prompt Prompt类的作用是创建结构化提示词, 实现了ModelRequest<List<Message>>接口 Prompt(String contents)&#xff1a;创建一个包含指定内容的Prompt对象。 Prompt(String contents, ChatOptions modelOptions)&#xff1a;创建一个…

Github 2024-07-26 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9HTML项目1TypeScript项目1非开发语言项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache…

【C++】初识C++基础篇·一(命名空间,函数重载,缺省参数,引用);

文章目录 前言1.输入与输出输出输入cin和scanf的对比 2.命名空间2.1namespace存在的意义2.2namespace的使用3.缺省参数4.函数重载重载函数的调用规则 5.引用 前言 我们先通过一段简单的代码来拉开C的序幕&#xff1b; //text.cpp #include<iostream> #include<stdio…

C++知识点总结:3.C++引用(自用)

C引用 1. 引用定义2. 引用的本质3. 引用和指针的不同之处补充指针常量和常量指针 4. 引用不能指代临时变量5. const引用&#xff08;常引用&#xff09;可以绑定临时数据6. const引用与转换类型 引用&#xff1a; [1]C语言中文网 [2]偶尔e网事,【C基础之二】常量指针和指针常量…

学习记录:ESP32控制舵机 FREERTOS BLE

控制舵机 PWM信号 PWM信号是一种周期性变化的方波信号&#xff0c;它有两个关键参数&#xff1a; 周期&#xff08;Period&#xff09;&#xff1a;一个完整的PWM信号的时间长度&#xff0c;通常用秒&#xff08;s&#xff09;或毫秒&#xff08;ms&#xff09;表示。占空比…

MQ消息队列+Lua 脚本实现异步处理下单流程

具体实现和代码可参考我以前做过的笔记&#xff1a;《黑马点评》异步秒杀优化|消息队列 回顾一下下单流程&#xff1a; 用户发起请求 会先请求Nginx,Nginx反向代理到Tomcat&#xff0c;而Tomcat中的程序&#xff0c;会进行串行工作&#xff0c; 分为以下几个操作&#xff1…

昇思25天学习打卡营第25天|基于 MindSpore 实现 BERT 对话情绪识别

基于 MindSpore 实现 BERT 对话情绪识别 模型概述 BERT&#xff08;双向编码器表征量&#xff09;是Google于2018年发布的一种先进语言模型&#xff0c;基于Transformer架构&#xff0c;具备双向上下文理解功能。BERT的预训练方法创新性地结合了两种任务&#xff1a; Masked …

高级网页爬虫开发:Scrapy和BeautifulSoup的深度整合

引言 在互联网时代&#xff0c;数据的价值日益凸显。网页爬虫作为一种自动化获取网页内容的工具&#xff0c;广泛应用于数据挖掘、市场分析、内容聚合等领域。Scrapy是一个强大的网页爬虫框架&#xff0c;而BeautifulSoup则是一个灵活的HTML和XML文档解析库。本文将探讨如何将…