建造者模式(Builder Pattern)

news2024/11/24 8:33:02

建造者模式(Builder Pattern)

    • 1、类型
    • 2、定义
    • 3、UML图
    • 4、四个角色
    • 5、代码
    • 6、应用场景

1、类型

创建型
解释:设计模式的创建性类型是一种软件设计模式,它专注于对象的创建机制,帮助我们更加灵活地创建对象实例。创建性设计模式主要关注如何更好地创建对象,以及如何将对象与其创建方式分离,从而使系统更加灵活、可扩展和易于维护。

常见的创建性设计模式包括:

  • 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪个类。这样在不改变该类的用户的情况下,可以修改实例化的具体类。

  • 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

  • 建造者模式(Builder Pattern):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

  • 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。

  • 原型模式(Prototype Pattern):用于创建重复的对象,同时又能保证性能。

2、定义

创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象

何时使用:一些基本部件不会变,而其组合经常变化的时候。

3、UML图

在这里插入图片描述

4、四个角色

  1. Product(产品角色): 一个具体的产品对象。

  2. Builder(抽象建造者): 创建一个Product对象的各个部件指定的接口/抽象类。

  3. ConcreteBuilder(具体建造者): 实现接口,构建和装配各个部件。

  4. Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个 复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

5、代码

// 产品角色
@Data
@ToString
public class Product {
    /**
     * 名称
     */
    private String name;
    /**
     * 价格
     */
    private Integer price;
}
// 抽象建造者
public abstract class Builder {


    public abstract void setProductName();

    public abstract void SetProductPrice();

    public abstract Product createProduct();

}
// 具体建造者1
public class ProductOne extends Builder {
    public Product product=new Product();

    public void setProductName() {
        this.product.setName("产品1");
    }

    public void SetProductPrice() {
        this.product.setPrice(100);
    }

    public Product createProduct() {
        return this.product;
    }

}
// 具体建造者2
public class ProductTwo extends Builder {
    public Product product = new Product();

    public void setProductName() {
        this.product.setName("产品2");
    }

    public void SetProductPrice() {
        this.product.setPrice(200);
    }

    public Product createProduct() {
        return this.product;
    }
}
//指挥者
public class Director {
    Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Product assemble() {
        this.builder.setProductName();
        this.builder.SetProductPrice();
        return this.builder.createProduct();
    }
}
// 客户端
public class Client {
    public static void main(String[] args) {

        Director director = new Director(new ProductOne());
        Product product = director.assemble();
        System.out.println(product);


        Director director1 = new Director(new ProductTwo());
        Product product1 = director1.assemble();
        System.out.println(product1);
    }
}

6、应用场景

  • 创建复杂对象:当需要创建一个复杂的对象,该对象拥有多个组成部分(例如具有多个属性或配置选项)且这些组成部分之间存在特定的创建顺序或依赖关系时,建造者模式可以很好地解决这种情况。

  • 需要创建不同表示的对象:如果希望在创建过程中能够灵活地控制对象的创建过程,以便根据不同的需求创建不同表示的对象,建造者模式是一个很好的选择。

  • 创建过程需要隔离:在某些情况下,我们希望将对象的构建过程与其最终表示分离开来,以便能够更加灵活地控制对象的创建过程。建造者模式正是为此而设计的。

  • 需要避免构造器参数过多:当一个类的构造函数参数过多或者存在多个重载的构造函数时,可以考虑使用建造者模式,通过链式调用的方式,使得参数设置更加清晰、易读。

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

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

相关文章

Python基础教程之十六:Python multidict示例–将单个键映射到字典中的多个值

1.什么是multidict词典> 在python中,“ multidict ”一词用于指代字典,在字典中可以将单个键映射到多个值。例如 多重结构 multidictWithList {key1 : [1, 2, 3],key2 : [4, 5]}multidictWithSet {key1 : {1, 2, 3},key2 : {4, 5}}1. list如果要…

“隐身术”成现实,中科院院士现场表演

(图源:哔哩哔哩) 在“bilibili超级科学晚”活动现场,中国科学院院士褚君浩为我们揭示了“隐身术”的原理。原来,这种神奇的技能是一种科学手段。 褚君浩院士为大家介绍了一种名为“柱镜光栅”的特殊材料,柱…

2.docker镜像的导入导出

目录 概述docker 常用命令下载导出导入镜像结束 概述 docker 常用命令 本章节使用到的命令,总结在此,后面有使用案例。 命令作用docker images显示镜像docker rmi $(docker images -q)删除系统上所有的镜像docker rmi -f强制删除多个镜像 &#xff1a…

MYSQL函数,一篇文章看完!

做程序员的谁会离得开数据库呢?今天就来分享一下我整理的MySQL的常用函数,基本上囊括了平时要用的函数,它们已经陪我走过了不少年头了,风里来雨里去,缝缝补补又几年,希望能帮到你们! 如果数据库…

图解电商系统的架构演进

具体以商城为例, 展示web端应用的架构演变过程。 特点: 1、所有的功能集成在一个项目工程中。 2、所有的功能打在一个war包部署到服务器。 3、通过部署应用集群和数据库集群来提高系统的性能。 优点 1、项目架构简单,前期开发成本低&#xf…

Python基础教程之十九:Python优先级队列示例

1.什么是优先队列 优先级队列是一种抽象数据类型,类似于常规队列或堆栈数据结构,但每个元素还具有与之关联的“优先级”。在优先级队列中,优先级高的元素先于优先级低的元素提供。如果两个元素具有相同的优先级,则将根据其在队列…

Python机器学习算法入门教程(第四部分)

接着Python机器学习算法入门教程(第三部分),继续展开描述。 十九、信息熵是什么 通过前两节的学习,我们对于决策树算法有了大体的认识,本节我们将从数学角度解析如何选择合适的“特征做为判别条件”,这里…

pdf.js不分页渲染(渲染完整内容)

直接上代码 首先引入pdf.js 和 pdf.worker.js // 渲染pdf const pdfUrl test1.pdf, _targetDom pdf-container;pdfjsLib.getDocument(pdfUrl).promise.then(async doc > {let _i 0;for (let item of new Array(doc.numPages).fill()) {await renderOtherPage(doc, _i, _t…

Julia绘图初步:Plots

文章目录 基础绘图绘图类型点线参数三维绘图 Julia开发环境 基础绘图 Julia中最常用的绘图模块自然是Plots,点击]进入安装模式后,输入add Plots即可安装,装完之后按下退格键回到Julia环境,就可以调用了 using Plots x 0:0.1:1…

立体相机标定

相机成像过程中涉及的4个坐标系: 1、世界坐标系:由用户定义的三维世界坐标系,描述物体和相机在真实世界中的位置,原点可以任意选择。 2、相机坐标系:以相机的光心为坐标原点,X轴和Y轴平行于图像坐标系的X轴…

(动手学习深度学习)第7章 稠密连接网络---DenseNet

目录 DenseNetDenseNet的优点:DenseNet的改进思路总结 DenseNet代码实现 DenseNet DenseNet的优点: 省参数。在 ImageNet 分类数据集上达到同样的准确率,DenseNet 所需的参数量不到 ResNet 的一半。对于工业界而言,小模型可以显著…

【Java 进阶篇】Java Filter 过滤器链详解

过滤器(Filter)是 Java Web 应用中重要的组件之一,它用于在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行处理。在实际开发中,我们可能会使用多个过滤器来完成不同的任务,这就引出了过滤器链的概念。本文…

[量化投资-学习笔记009]Python+TDengine从零开始搭建量化分析平台-KDJ

技术分析有点像烹饪,收盘价、最值、成交量等是食材;均值,移动平均,方差等是烹饪方法。随意组合一下就是一个技术指标。 KDJ又称随机指标(随机这个名字起的很好)。KDJ的计算依据是最高价、最低价和收盘价。…

Unity--UGUI创建基本的UI

随着UI系统的引入,已添加了新组件,这些组件将有助于创建特定于GUI的功能。其中一些元素包括文本,图像,按钮等。在本教程中,您将学习创建和使用基本UI。 1.创建基本的UI 通过Unity的用户界面(UI)…

UE5数字孪生制作-数据篇(二) - 数据处理

1.卫星图与DEM高度图坐标一致处理 https://www.bilibili.com/video/BV1op4y1V71r?p4&vd_source707ec8983cc32e6e065d5496a7f79ee6 坐标系的调整 如何使用临时图层,对其他数据层进行裁切 (1)创建临时图层 (2)在临…

Zotero拓展功能之Zotero Style

Zotero Style拓展功能 一、列: 1.简介 首先你必须知道Zotero的基本功能:右键任意一个列的名字,会弹出一个右键菜单,你可以勾选/取消勾选一个列,并且在最后有两个按钮,一个是“列设置”,一个是…

如何用Java实现一个基于机器学习的情感分析系统,用于分析文本中的情感倾向

背景:练习两年半(其实是两周半),利用工作闲余时间入门一下机器学习,本文没有完整的可实施的案例,由于知识体系不全面,目前代码只能运行,不能准确的预测 卡点: 1 由于过…

WebSocket在node端和客户端的使用

摘要 如果想要实现一个聊天的功能,就会想到使用WebSocket来搭建。那如果没有WebSocet的时候,我们会以什么样的思路来实现聊天功能呢? 假如有一个A页面 和 B页面进行通信,当A发送信息后,我们可以将信息存储在文件或者…

程序员35岁之后如何规划?建议收藏!

文章目录 一、年纪大能不能进大厂?二、为什么说35是危机? 1.精力衰退2.脑力衰退3.知识/技术迭代 三、年龄大的程序员有哪些出路? 1.技术管理2.创业3.技术外包4.做老师5.做自媒体6.写书 四、结语 我自己今年已有44了,从2021年开始…

基于讯飞星火大语言模型开发的智能插件:小策问答

星火大语言模型是一种基于深度学习的自然语言处理技术,它能够理解和生成人类语言。这种模型的训练过程涉及到大量的数据和复杂的算法,但最终的目标是让机器能够像人一样理解和使用语言。 小策问答是一款基于星火大语言模型的定制化GPT插件小工具。它的主…