java设计模式之创建者模式(5种)

设计模式

软件设计模式,又称为设计模式,是一套被反复利用,代码设计经验的总结,他是在软件设计过程中的一些不断发生的问题,以及该问题的解决方案。

**创建者模式又分为以下五个模式:**用来描述怎么“将对象的创建和使用分离”
在这里插入图片描述

UML

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
软件设计原则:开闭原则:对扩展开放,对修改关闭;里氏代换原则:任何基类可以出现的地方,子类一定可以出现。(子类可以扩展父类的功能,但不能改变父类原有的功能);依赖倒转原则:高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。接口隔离原则:客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在更小的接口上。迪米特法则:又叫做最少知识原则,如果两个软件实体无法直接通信,那么就不应该发生直接的相互调用,可以通过第三方转发该调用。目的是降低类之间的耦合度。合成复用法则:尽量使用组合或者聚合等关联关系实现,其次才考虑继承关系来实现。

创建者模式

关注点是“怎样创建对象?”主要特点是“将对象的创建和使用分离

单例模式

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。该类提供了一种访问其唯一个对象的方式,可以直接访问,不需要实例化该类的对象。
在这里插入图片描述

单例模式的实现

在这里插入图片描述
饿汉式-静态变量的方式
在这里插入图片描述
饿汉式-静态代码块的方式(随着类的加载而创建)

在这里插入图片描述
懒汉式-线程不安全(首次使用对象才会创建)
在这里插入图片描述
懒汉式-线程安全(加入锁机制导致该方法的执行效果较低)
在这里插入图片描述
懒汉式-双重检查锁
在这里插入图片描述
在这里插入图片描述
懒汉式-静态内部类(保证多线程安全下,并没有任何性能影响)
在这里插入图片描述
枚举方式-极力推荐
在这里插入图片描述
通过序列化和反射来破坏单例模式

简单工厂模式——不是一种设计模式,而是一种编程习惯
结构:抽象产品:定义了产品的规范,描述产品的主要特征和功能。
具体产品:实现或继承抽象产品的子类。具体工厂:提供了创建产品的方法,调用者通过该方法来创建产品。

在这里插入图片描述
在这里插入图片描述

工厂方法模式

概念:定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。
结构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

抽象工厂模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
模式扩展
简单工厂+配置文件解除耦合
可以通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合。在工厂类中加载配置文件中的全类名,并创建对象进行存储,客户端如果需要对象,直接进行获取即可。
1.定义配置文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

原型模式

概念:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
java中的object类中提供的clone()方法来实现浅克隆,cloneable接口是上面的类图中的抽象原型类,而实现了cloneable接口的子实现类就算具体的原型类。
在这里插入图片描述
在这里插入图片描述

建造者模式

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.4.6 扩展 - 构建对象
建造者模式除了上面的用途外,在开发中还有一个常用的使用方式,就是当一个类构造器需要传入很多参数时,如果创建这个类的实例,代码可读性会非常差,而且很容易引入错误,此时就可以利用建造者模式进行重构。

重构前

public class Phone {private String cpu;private String screen;private String memory;private String mainboard;public Phone(String cpu, String screen, String memory, String mainboard) {this.cpu = cpu;this.screen = screen;this.memory = memory;this.mainboard = mainboard;}public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}public String getScreen() {return screen;}public void setScreen(String screen) {this.screen = screen;}public String getMemory() {return memory;}public void setMemory(String memory) {this.memory = memory;}public String getMainboard() {return mainboard;}public void setMainboard(String mainboard) {this.mainboard = mainboard;}@Overridepublic String toString() {return "Phone{" +"cpu='" + cpu + '\'' +", screen='" + screen + '\'' +", memory='" + memory + '\'' +", mainboard='" + mainboard + '\'' +'}';}
}
public class Client {public static void main(String[] args) {// 构建Phone对象Phone phone = new Phone("intel","三星屏幕","金士顿","华硕");System.out.println(phone);}
}

重构后使用构建者模式重构代码:

public class Phone {private String cpu;private String screen;private String memory;private String mainboard;// 私有构造方法private Phone(Builder builder) {this.cpu = builder.cpu;this.screen = builder.screen;this.memory = builder.memory;this.mainboard = builder.mainboard;}public static final class Builder {private String cpu;private String screen;private String memory;private String mainboard;public Builder cpu(String cpu) {this.cpu = cpu;return this;}public Builder screen(String screen) {this.screen = screen;return this;}public Builder memory(String memory) {this.memory = memory;return this;}public Builder mainboard(String mainboard) {this.mainboard = mainboard;return this;}// 使用构建者创建Phone对象public Phone build() {return new Phone(this);}}@Overridepublic String toString() {return "Phone{" +"cpu='" + cpu + '\'' +", screen='" + screen + '\'' +", memory='" + memory + '\'' +", mainboard='" + mainboard + '\'' +'}';}
}

在客户端中构建对象:使用起来更灵活方便,某种程度上也可以提高开发效率。

public class Client {public static void main(String[] args) {Phone phone = new Phone.Builder().cpu("intel").mainboard("华硕").memory("金士顿").screen("三星").build();System.out.println(phone);}
}

在 Lombok 中只需要使用 @Builder 即可使用构建者模式来构建对象。
在这里插入图片描述

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

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

相关文章

SpringSecurity框架(入门)

简介: Spring Security 是一个用于构建安全的 Java 应用程序的框架,尤其适用于基于Spring的应用程序。它提供了全面的安全控制,从认证(Authentication)到授权(Authorization),以及…

广东网站设计提升你网站在搜索引擎中的排名

在当今网络盛行的时代,拥有一个设计优良的网站,对企业的在线发展至关重要。特别是对于广东地区的企业来说,网站设计不仅仅是美观的问题,更直接影响着搜索引擎中的排名。因此,精心策划和设计的网站,能够显著…

Cuebric:用AI重新定义3D创作的未来

一、简介 Cuebric 是一家成立于2022年夏天的好莱坞创新公司,致力于为电影、电视、游戏和时尚等行业提供先进的AI多模态SaaS平台。自2024年1月正式推出以来,Cuebric 已经在市场上获得了广泛的认可和积极的反馈。目前,该平台正处于1.0版本的beta测试阶段,已募集约50万美元的…

计算机的错误计算(一百四十)

摘要 探讨 MATLAB 中函数 的计算精度。 从计算机的错误计算(一百三十九)知,对于对数运算,当真数在 1 附近时,计算机的输出会出现较大误差。为此,IEEE 754-2019 中专门定义有函数 其目的就是当自变量在 …

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作:点击按键和释放按键,也就是按键按下和松开。按键按下的对应的事件是KEYDOWN,按键松开对应…

《高频电子线路》 —— 高频谐振功放(2)

动态特性与负载特性 动态特性 静态特性是指,不考虑负载阻抗的时候获得的,即转移特性曲线和输出特性曲线。 考虑负载时,电流变化的时候,负载上的电压就会变化,管子上面的Vce也会变化。 考虑负载的反作用后&#xff0c…

SpringBoot 下的Excel文件损坏与内容乱码问题

序言 随着打包部署的方式的改变,原本正常运行的代码可能带来一些新的问题,比如我们现在使用SpringBoot 的方式生成Jar包直接运行,就会对我们再在Resource下的Excel文件产生影响,导入与预期不符的情况发生cuiyaonan2000163.com 比…

「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用

在鸿蒙应用开发中,Image 组件用于加载和显示图片资源,并提供多种属性来控制图片的显示效果和适配方式。本篇将带你学习如何在鸿蒙应用中加载本地和远程图片、设置图片样式以及实现简单的图片轮播功能。 关键词 Image 组件图片加载本地资源远程图片图片轮播一、Image 组件基础…

上海亚商投顾:沪指缩量调整 华为概念股午后爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整,沪指、深成指午后跌超1%,创业板指一度跌逾2%,尾盘跌幅有…

vim命令及shell命令

目录 vim命令 vim三种工作模式 光标的跳转 复制粘贴 剪切删除 撤销回滚替换 翻页 其他 shell编程命令 判断用户的参数 可用的整数比较运算符 常见的字符串比较运算符 if条件测试语句 for条件循环语句 vim命令 vim三种工作模式 Vim编辑器中设置了三种模式: 命令…

Z 检验和 T 检验之间的区别

目录 一、说明 二、什么是假设检验? 三、假设检验基础 3.1 假设检验的基本概念 3.2 、执行假设验证的步骤 3.3 临界值、P 值 3.4 方向假设 3.5 非方向假设检验s 四、什么是 Z 检验统计量? 五、Z 检验示例 5.1 单样本 Z 检验 5.2 双样本 Z 检…

Qt限制QGraphicsScene QGraphicsItem内部的移动范围

用过QGraphicsView的都知道,原点一般设定在view和item的中心,所以帮助文档和这个网友说的不一定跟我们对的上: 关于Qt限制QGraphicsScene内部Item的移动范围_qgraphicsitem限制移动范围-CSDN博客 首先,设定view的scenerect&…

【Redis】浅析Redis大Key

目录 1、什么是Redis大Key 2、大 Key 是怎么产生的 3、大 Key 导致的问题 4、如何快速找到 Redis 大 Key 5、大 Key 优化策略 6、总结 我们在使用 Redis 的过程中,如果未能及时发现并处理 Big keys(下文称为“大Key”),可能…

Jedis操作和springboot整合redis

Jedis-springboot整合redis Jedis 引入jedis依赖 注意事项 测试相关数据类型 Key String List set hash zset 案例 spring boot整合redis 引入相关依赖 在application.properties中配置redis 配置 创建redis配置类 创建测试类 Jedis 引入jedis依赖 <depen…

GenAI 生态系统现状:不止大语言模型和向量数据库

自 20 个月前 ChatGPT 革命性的推出以来&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;领域经历了显著的发展和创新。最初&#xff0c;大语言模型&#xff08;LLMs&#xff09;和向量数据库吸引了最多的关注。然而&#xff0c;GenAI 生态系统远不止这两个部分&#…

HTML、JavaScript和CSS实现注册页面设计

目录 一、实现要求 二、实现页面图 1、注册页面 2.用户ID、用户名、口令验证成功后显示页面 三、用户ID、用户名、口令、确定口令验证逻辑js代码 1、验证用户ID 2、验证用户名 3、验证口令密码 四、总结 五、代码仓库 一、实现要求 综合使用HTML、JavaScript和CSS进…

Vue前端开发:事件绑定方式

事件定义 在Vue中&#xff0c;当一个元素通过使用v-on或语法糖指令绑定某个事件后&#xff0c;则完成了事件被定义的过程&#xff0c;在这定义的过程中&#xff0c;指令的后面是定义事件的名称&#xff0c;等号的后面是事件被触发后执行的函数&#xff0c;当然&#xff0c;也可…

mac-ubuntu虚拟机(扩容-共享-vmtools)

一、磁盘扩容 使用GParted工具对Linux磁盘空间进行扩展 https://blog.csdn.net/Time_Waxk/article/details/105675468 经过上面的方式后还不够&#xff0c;需要再进行下面的操作 lvextend 用于扩展逻辑卷的大小&#xff0c;-l 选项允许指定大小。resize2fs 用于调整文件系统的…

【AAOS】【源码分析】CarSystemUI

目录 目录 概述 CarSystemUI组件 源代码 源码位置 主要模块 编译选项 CarSystemUI与SystemUI 编译方式 Car Emulator默认服务 CarSystemUI 启动流程 缩略词 概述 AAOS中的SystemUI虽然相较手机要简单不少,但却是车载开发中的一个重要组件,它负责管理和控制车机…

C++知识点复习

对于这些问题的回答&#xff0c;可以按照思维导图的结构来组织答案&#xff0c;然后再进行回答。 C11用过哪些特性&#xff1f; &#xff08;首先&#xff0c;要回答好这个问题&#xff0c;需要注意问题的层次&#xff0c;不要一上来就说新增了某某关键字和语法&#xff0c;在…