【设计模式--创建型--建造者模式】

建造者模式

    • 建造者模式
      • 概述
      • 结构
      • 结果
      • 优缺点
      • 使用场景
    • 将上述案例改为链式调用
      • 结果

建造者模式

概述

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

  • 分离了部件的构建(由Builder来负责)和装配(由Director负责)。从而可以构建出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。
  • 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。实现了更好的复用。
  • 建造者模式可以将部件与其组装过程分开,一步一步创建一个复杂对象。用户只需要指定复杂对象的类型就可以获得该对象,而无需知道内部的构造细节。

结构

建造者(Builder)模式包含如下角色:

  • 抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。
  • 具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。
  • 产品类(Product):要创建的复杂对象
  • 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各个部分完整创建或按某种顺序创建。
    类图:
    在这里插入图片描述
/*** 抽象建造者类*/
public abstract class Builder {// 声明computer类型的变量,并赋值protected Computer computer = new Computer();public abstract Computer createComputer();public abstract void builderMemory();public abstract void builderHardDrive();public abstract void builderMotherBoard();public abstract void builderPowerSource();public abstract void builderCpu();
}
/*** 电脑类*/
public class Computer {private String memory;private String hardDrive;private String motherBoard;private String powerSource;private String cpu;public String getMemory() {return memory;}public void setMemory(String memory) {this.memory = memory;}public String getHardDrive() {return hardDrive;}public void setHardDrive(String hardDrive) {this.hardDrive = hardDrive;}public String getMotherBoard() {return motherBoard;}public void setMotherBoard(String motherBoard) {this.motherBoard = motherBoard;}public String getPowerSource() {return powerSource;}public void setPowerSource(String powerSource) {this.powerSource = powerSource;}public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}@Overridepublic String toString() {return "Computer{" +"memory='" + memory + '\'' +", hardDrive='" + hardDrive + '\'' +", motherBoard='" + motherBoard + '\'' +", powerSource='" + powerSource + '\'' +", cpu='" + cpu + '\'' +'}';}
}
/*** 指挥者类*/
public class Director {// 声明builder类型的变量private Builder builder;public Director(Builder builder){this.builder =builder;}// 组装电脑public Computer construct(){builder.builderMotherBoard();builder.builderCpu();builder.builderMemory();builder.builderHardDrive();builder.builderPowerSource();return builder.createComputer();}
}
/*** 联想电脑构建者 实现抽象构建者类*/
public class LXComputerBuilder extends Builder{@Overridepublic Computer createComputer() {return computer;}@Overridepublic void builderMemory() {computer.setMemory("8G");}@Overridepublic void builderHardDrive() {computer.setMemory("512G");}@Overridepublic void builderMotherBoard() {computer.setMotherBoard("一块好板");}@Overridepublic void builderPowerSource() {computer.setPowerSource("600w");}@Overridepublic void builderCpu() {computer.setCpu("i5");}
}
/*** 惠普电脑构建者 实现抽象构建者类*/
public class PHComputerBuilder extends Builder{@Overridepublic Computer createComputer() {return computer;}@Overridepublic void builderMemory() {computer.setMemory("16G");}@Overridepublic void builderHardDrive() {computer.setHardDrive("512G");}@Overridepublic void builderMotherBoard() {computer.setMotherBoard("普通的主板");}@Overridepublic void builderPowerSource() {computer.setPowerSource("500w");}@Overridepublic void builderCpu() {computer.setCpu("i7");}
}
public class Test01 {public static void main(String[] args) {// 创建指挥者类,传入惠普电脑构建者类Director director = new Director(new PHComputerBuilder());// 调用指挥者类的构建方法,构建惠普电脑Computer construct = director.construct();System.out.println(construct.toString());}
}

结果

在这里插入图片描述

优缺点

  • 优点:
    • 建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在指挥者类中对整体而而言可以取得比较好的稳定性。
    • 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
    • 可以更加精细的控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也方便使用程序来控制创建过程。
    • 建造者模式很容易进行扩展。如果由新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前的代码,符合开闭原则。
  • 缺点:
    • 建造者模式所创建的产品一般具有较多共同点,其组成部分相似,如果产品之间差异很大,则不适用建造者模式,因此使用范围受到一定的限制。

使用场景

建造者(Builder)模式创建的是复杂对象,其产品的各个部分经常面临剧烈的变化,但是将他们组合在一起的算法却相对稳定,所有通常在一下场合使用:

  • 创建的对象较复杂,由多个部件构成,各部件面临复杂变化,但构建顺序是相对稳定的
  • 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的

将上述案例改为链式调用

在这里插入图片描述

/*** 电脑类*/
public class Computer {private String memory;private String hardDrive;private String motherBoard;private String powerSource;private String cpu;// 构造方法public Computer(Builder builder) {this.cpu = builder.cpu;this.hardDrive = builder.hardDrive;this.motherBoard = builder.motherBoard;this.powerSource = builder.powerSource;this.memory = builder.memory;}// 将创建者声明为静态内部类public static final class Builder {private String memory;private String hardDrive;private String motherBoard;private String powerSource;private String cpu;public Builder cpu(String cpu){this.cpu = cpu;return this; // 直接返回 this,即 Builder对象}public Builder powerSource(String powerSource){this.powerSource = powerSource;return this;}public Builder motherBoard(String motherBoard){this.motherBoard = motherBoard;return this;}public Builder hardDrive(String hardDrive){this.hardDrive = hardDrive;return this;}public Builder memory(String memory){this.memory = memory;return this;}// 直接调用Computer类的构造方法,传入this,即 Builder对象public Computer build(){return new Computer(this);}}@Overridepublic String toString() {return "Computer{" +"memory='" + memory + '\'' +", hardDrive='" + hardDrive + '\'' +", motherBoard='" + motherBoard + '\'' +", powerSource='" + powerSource + '\'' +", cpu='" + cpu + '\'' +'}';}
}
public class Test02 {public static void main(String[] args) {Computer computer = new Computer.Builder().cpu("i9").hardDrive("2T").memory("32G").powerSource("1000w").motherBoard("华硕").build();System.out.println(computer);}
}

结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析基础之《numpy(2)—ndarray属性》

一、ndarray的属性 1、属性方法 属性名字属性解释ndarray.shape数组维度的元组(形状)ndarray.ndim数组维数ndarray.size数组中的元素数量ndarray.itemsize一个数组元素的长度(字节)ndarray.dtype数组元素的类型使用方法 数组名.…

postgresql安装部署(docker版本)

1.在线部署 创建数据库存储目录 mkdir /home/pgdata创建容器 docker run --name postgresql --restartalways -d -p 5432:5432 -v /home/pgdata:/var/lib/postgresql/data --shm-size10g -e POSTGRES_PASSWORD密码 postgis/postgis:12-3.2-alpine–name为设置容器名称 -d表…

12.视图

目录 1.视图的含义与作用 2.视图的创建与查看 1.创建视图的语法形式 2、查看视图: 1.使用DESCRIBE语句查看视图基本信息 2.使用SHOW TABLE STATUS语查看视图基本信息查看视图的信息 3.使用SHOW CREATE VIEW语查看视图详细信息 4.在views表中查看视图详细信息…

react.js源码二

三、调度Scheduler scheduling(调度)是fiber reconciliation的一个过程,主要决定应该在何时做什么?在stack reconciler中,reconciliation是“一气呵成”,对于函数来说,这没什么问题,因为我们只想要函数的运行结果&…

C语言----文件操作(一)

一:C语言中文件的概念 对于文件想必大家都很熟悉,无论在windows上还是Linux中,我们用文件去存储资料,记录笔记,常见的如txt文件,word文档,log文件等。那么,在C语言中文件是什么样的存…

一文掌握Ascend C孪生调试

1 What,什么是孪生调试 Ascend C提供孪生调试方法,即CPU域模拟NPU域的行为,相同的算子代码可以在CPU域调试精度,NPU域调试性能。孪生调试的整体方案如下:开发者通过调用Ascend C类库编写Ascend C算子kernel侧源码&am…

从线性回归到神经网络

目录 一、线性回归关键思想 1、线性模型 2、基础优化算法 二、线性回归的从零开始实现 1、生成数据集 2、读取数据集 3、初始化模型参数 4、定义模型 5、定义损失函数 6、定义优化算法 7、训练 三、线性回归的简洁实现 1、生成数据集 2、读取数据集 3、定义模型…

Nodejs后端+express框架

前言 基于vue3Node后台管理项目,补充nodejs和express相关知识。 文章目录 一,express 1.官网 Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网 2.安装 npm install express --save 二、MongoDB 特点 非关…

ActiveMQ任意文件写入漏洞(CVE-2016-3088)

简述:ActiveMQ的fileserver支持写入文件(但是不支持解析jsp),同时也支持移动文件。所以我们只需要先上传到服务器,然后再移动到可以解析的地方即可造成任意文件写入漏洞。我们可以利用这个漏洞来上传webshell或者上传定时任务文件。 漏洞复现 启动环境 …

持续集成交付CICD:Jenkins流水线实现Nexus制品晋级策略

目录 一、理论 1.开发测试运维环境 二、实验 1.Nexus制品晋级策略 一、理论 1.开发测试运维环境 (1)环境 1)持续集成开发环境(DEV: Development Environment) 直接通过源代码编译打包,其会跑单元测试…

最新Redis7持久化(权威出版)

首先我们要知道什么是持久化:持久化是指将数据保存到磁盘上,以确保在Redis服务器重启时数据不会丢失。 Redis支持两种主要的持久化方式:RDB持久化和AOF持久化 下面让我依次给你介绍一下: RDB持久化 作用 这是将Redis数据保存…

二分查找|滑动窗口|前缀和|LeetCode209: 长度最小的子数组

长度最短的子数组 作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 滑动窗口 题目 给定一个含有 n 个正整数的数组和一个正整数 target…

基于JavaWeb+SSM+Vue微信小程序的科创微应用平台系统的设计和实现

基于JavaWebSSMVue微信小程序的科创微应用平台系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术…

MongoDB的条件操作符

本文主要介绍MongoDB的条件操作符。 目录 MongoDB条件操作符1.比较操作符2.逻辑操作符3.元素操作符4.数组操作符5.文本搜索操作符 MongoDB条件操作符 MongoDB的条件操作符主要分为比较操作符、逻辑操作符、元素操作符、数组操作符、文本搜索操作符等几种类型。 以下是这些操作…

前端开发tips

前端开发tips 关于package.json里面,尖角号(^)和波浪线(~)的区别 在package.json里面,我们可以使用尖角号(^)和波浪线(~)来表示不同的包版本。这些符号通常被…

mysql中的DQL查询

表格为: DQL 基础查询 语法:select 查询列表 from 表名:(查询的结果是一个虚拟表格) -- 查询指定的列 SELECT NAME,birthday,phone FROM student -- 查询所有的列 * 所有的列, 查询结果是虚拟的表格&am…

Xcode doesn’t support iOS 16.6

xocde版本低,手动放入16.6的依赖文件 https://gitee.com/qiu1993/iOSDeviceSupport/blob/master/iOS16/16.6.zip 路径 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

harmonyos预览功能报错:[webpack-cli] SyntaxError: Unexpected end of JSON input

harmonyos预览功能报错 在使用DevEco Studio写页面&#xff0c;进行预览的时候报错&#xff1a; [Compile Result] [webpack-cli] SyntaxError: Unexpected end of JSON input [Compile Result] at JSON.parse (<anonymous>) [Compile Result] at updateCached…

【数据结构】——排序篇(下)

前言&#xff1a;前面我们的排序已经详细的讲解了一系列的方法&#xff0c;那么我们现在久之后一个归并排序了&#xff0c;所以我们现在就来讲解一下归并排序。 归并排序&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法…

ChatGLM3-6B和langchain阿里云部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ChatGLM3-6B部署搭建环境部署GLM3 二、Chatglm2-6blangchain部署三、Tips四、总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; …