设计模式理解:单例模式+工厂模式+建设者模式+原型模式

迪米特法则:Law of Demeter, LoD, 最少知识原则LKP
如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
所以,在运用迪米特法则时要注意以下 6 点。

  • 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
  • 在类的结构设计上,尽量降低类成员的访问权限。
  • 在类的设计上,优先考虑将一个类设置成不变类。
  • 在对其他类的引用上,将引用其他对象的次数降到最低。
  • 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。
  • 谨慎使用序列化(Serializable)功能。

创建型模式:工厂模式、抽象工厂模式、生成器模式、原型模式、单例模式
结构型模式:适配器、桥接、组合、装饰器、外观、享元、代理

单件模式 Singleton Pattern

要求一个类有且仅有一个实例,并提供了一个全局的访问点,在同一时刻只能被一个线程所访问。
特点:

  1. 单件类只能有一个实例;
  2. 单件类必须自身创建唯一实例;
  3. 单件类必须给所有其他对象提供唯一实例。

https://www.cnblogs.com/libingql/archive/2012/12/01/2797532.html

实现要点:

  1. 单件类有一个私有的无参构造函数,防止被其他类实例化;
  2. 单件类不能被继承;
  3. 单件类使用静态变量保存单实例的引用;
  4. 单件类使用公有静态方法获取单一实例的引用,如果实例为null则创建一个。

实现方式

  1. 使用类的内部类(线程安全)推荐
public class Singleton_04 {private static class SingletonHolder {private static Singleton_04 instance = new Singleton_04();}private Singleton_04() {}public static Singleton_04 getInstance() {return SingletonHolder.instance;}
}
  1. 双重锁校验(线程安全)
public class Singleton_05 {private static Singleton_05 instance;private Singleton_05() {}public static Singleton_05 getInstance(){if(null != instance) return instance;synchronized (Singleton_05.class){if (null == instance){instance = new Singleton_05();}}return instance;}
}

双重锁的方式是方法级锁的优化,减少了部分获取实例的耗时。

  1. CAS AtomicReference(线程安全)

  2. 枚举单例

public enum Singleton_07 {INSTANCE;public void test(){System.out.println("hi~");}
}
// 使用:
Singleton_07.INSTANCE.test();

工厂模式

举例
impl是各自的实现都继承了ICommodity接口。StoreFactory中通过参数控制调用不同实例。
在这里插入图片描述
在这里插入图片描述
优点:

  • 避免创建者与具体的产品逻辑耦合;
  • 满足单一职责,每个业务逻辑的实现都在自己所属的类中完成;
  • 满足开闭原则,无需更改使用调用方就可以在程序中引入新的产品类型

缺点:
可能会有非常多的子类 → 应使用其他模式进行优化

抽象工厂模式

抽象工厂是一个中心工厂,可以创建其他工厂的模式。

抽象工厂模式要解决的问题是:在一个产品族,存在多个不同类型的产品(Redis集群、操作系统)的情况下,如何选择接口的问题。

比如原有一个单机Redis,随着业务的发展,有了更健壮的Redis集群A和B(分别提供不同的接口和方法),需要把Redis升级但不能影响目前系统的运行。
在这里插入图片描述

建设者模式

将多个简单对象一步步地组装构建出一个复杂对象。

将一个复杂的构建与其表示分离,使得同样的构建过程可以创建不同的表示。(因为每个组装中可以选用不同的原料、元件)

举例:修改前
在这里插入图片描述
Matter.java主要保证所有的装修材料可以按照统一标准进行获取。其他类都实现了Matter接口。这样在使用时需要很多个if else。修改后:
在这里插入图片描述
IMenu是接口类,DecorationPackageMenu实现了IMenu接口,是填充器,
Builder建造者类具体的各种组装。
在这里插入图片描述
DecorationPackageMenu类里有一个List list,一个price,一个area,一个grade(装修等级)
,所以添加matter(组装)的同时可以计算价格和面积啥的,也就可以打印单子了。(以往这些是放在各个类的)。
在这里插入图片描述
Builder类只是调用DecorationPackageMenu类中的方法实现组装而已。

何时选择建造者模式?一些基本物料不变,而其组合经常变化时。

原型模式

原型模式主要解决的问题是创建重复对象,而这种对象内容本身比较复杂,生成过程可能从库或RPC接口中获取数据的耗时较长,因此采用克隆的方式节省时间。

举例:
上机考试抽题服务。有问答题和选择题,未来可能有更多题型。但是题目不能每次都从库或者更远的地方抽取,因为如果创建对象很多的话,会非常耗时。

在这里插入图片描述
QuestionBank(实现了Cloneable)负责将各个题目进行组装最终输出试卷,主要包括append()和clone(),clone()里不止复制,更有乱序功能。Controller就是初始化,以及提供createPaper()。

Cloneable是标记型的接口,它们内部都没有方法和属性,实现 Cloneable来表示该对象能被克隆,能使用Object.clone()方法。如果没有实现 Cloneable的类对象调用clone()就会抛出CloneNotSupportedException。

优点:
便于通过克隆方式创建复杂对象,可以避免重复做初始化操作,不需要与类中所属的其他类耦合。

缺点:
如果对象中包括了循环引用的克隆,以及类中深度使用对象的克隆,会使此模式变麻烦。

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

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

相关文章

电力负荷预测 | 基于GRU门控循环单元的深度学习电力负荷预测,含预测未来(Python)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | 基于GRU门控循环单元的深度学习电力负荷预测,含预测未来(Python&

【AutoML】AutoKeras 进行 RNN 循环神经网络训练

由于最近这些天都在人工审查之前的哪些问答数据,所以迟迟都没有更新 AutoKeras 的训练结果。现在那部分数据都已经整理好了,20w 的数据最后能够使用的高质量数据只剩下 2k。这 2k 的数据已经经过数据校验并且对部分问题的提问方式和答案内容进行了不改变…

【开源】SpringBoot框架开发超市账单管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

[当人工智能遇上安全] 11.威胁情报实体识别 (2)基于BiGRU-CRF的中文实体识别万字详解

您或许知道,作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个《当人工智能遇上安全》系列博客,详细介绍人工智能与安全相关的论文、实践,并分享各种案…

基于java+springboot+vue实现的房屋租赁管理系统(文末源码+Lw)23-142

第1章 绪论 房屋租赁管理系统管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、字典管理、租房房源管理、租房评价管理、房源租赁管理、租房预约管理、论坛管理、公告管理、投诉建议管理、用户管理、租房合同管理、管理员管理。用户的功能等。该系统采用了My…

CODE V的API 之 PSF数据的获取(3)

PSF的获取 文章目录 PSF的获取前言一、主要代码总结 前言 主要利用buf语句进行传递,在worksheet中有收藏。 一、主要代码 Sub OnRunPSF() Dim session As CVCommand Set session CreateObject("CodeV.Command.102") session.SetStartingDirectory (&q…

idea自带的HttpClient使用

1. 全局变量配置 {"local":{"baseUrl": "http://localhost:9001/"},"test": {"baseUrl": "http://localhost:9002/"} }2. 登录并将结果设置到全局变量 PostMapping("/login")public JSONObject login(H…

Unity SRP 管线【第十讲:SRP/URP 图形API】

Unity 封装的图形API 文章目录 Unity 封装的图形API一、 CommandBuffer 要执行的图形命令列表1. CommandBuffer 属性2. CommandBuffer 常用图形API(方法)(1)设置(2)获取临时纹理 GetTemporaryRT以及释放(3)设置纹理为渲染目标 SetRenderTarget(4)Command…

08-Java过滤器模式 ( Filter Pattern )

Java过滤器模式 实现范例 过滤器模式(Filter Pattern)或允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 过滤器模式(Filter Pattern) 又称 标准模式(Criteria Pattern…

windows中的apache改成手动启动的操作步骤

使用cmd解决安装之后开机自启的问题 services.msc 0. 这个命令是打开本地服务找到apache的服务名称 2 .通过服务名称去查看服务的状态 sc query apacheapache3.附加上关掉和启动的命令(换成是你的服务名称) 关掉命令 sc stop apacheapache启动命令 …

推荐收藏!数据分析岗最走心的面经!

年底了,技术群组织了一场机器学习算法岗技术&面试讨论会,邀请了一些同学分享他们的面试经历,讨论会会定期召开,如果你想加入我们的讨论群或者希望要更详细的资料,文末加入。 喜欢本文记得收藏、关注、点赞 &#…

Springboot项目报文加密(AES、RSA、Filter动态加密)

Springboot项目报文加密(AES、RSA、Filter动态加密) 一、痛点1.1、初版报文加密二、前期准备2.1、AES加密2.2、RSA加密2.3、国密算法概述2.4、国密SM22.5、国密SM32.6、国密SM42.7、JAVA中的拦截器、过滤器2.8、请求过滤器2.9、响应过滤器2.10、登录验证码2.11、BCrypt非对称…

C++ STL

STL 标准模版库 STL 从广义上分为容器 算法 迭代器 容器 (算法之间通过迭代器进行无缝链接) STL几乎所有的代码都采用了模版类或者模版函数 STL六大组件 分别是容器 算法 迭代器 仿函数 适配器(配接器)空间配置器 容器 各种…

【Git版本控制 04】标签管理

目录 一、创建标签 二、查看标签 三、推送标签 四、删除标签 一、创建标签 标签tag,是对某次 commit 的⼀个标识,相当于起了⼀个别名。 相较于难以记住的 commit id , tag 很好的解决这个问题,因为 tag ⼀定要给⼀个让⼈容易…

使用ChatGpt和文心一言辅助文章创作

近期在写数字水浒系列文章,使用了ChatGpt和文心一言进行辅助创作,整体感受不错,提高了工作效率。 在使用过程中,感觉文心的中文能力更强一些,主要体现在: 1 语料库更大,比如对水浒传了解的更多…

Text2SQL研究-Chat2DB体验与剖析

文章目录 概要业务数据库配置Chat2DB安装设置原理剖析 小结 概要 近期笔者在做Text2SQL的研究,于是调研了下Chat2DB,基于车辆订单业务做了一些SQL生成验证,有了一点心得,和大家分享一下.: 业务数据库设置 基于车辆订…

Linux第43步_移植ST公司uboot的第4步_uboot测试

uboot移植结束后,需要进行测试。 1、烧录程序 1)、将STM32MP157开发板的网络接口与路由器的网络接口通过网线连接起来。 2)、将开发板的串口和电脑通过USB线连接起来。 3)、将开发板的USB OTG接口和电脑通过USB线连接起来。 4)、将开发板上拨码开关拨到“000”…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ScrollBar组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ScrollBar组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、ScrollBar组件 鸿蒙(HarmonyOS)滚动条组件ScrollBar&…

Leetcode3020. 子集中元素的最大数量

Every day a Leetcode 题目来源:3020. 子集中元素的最大数量 解法1:哈希 枚举 用一个哈希表统计数组 nums 中的元素及其出现次数。 暴力枚举数组中的数,作为 x,然后不断看 x2,x4,⋯ 在数组中的个数。直到个数不足 2 个为止&a…

搭建macOS开发环境-1:准备工作

请记住: 最重要的准备工作永远是:备份数据 !!! 通过图形界面检查 Mac 的 CPU 类型: 在搭载 Apple 芯片的 Mac 电脑上,“关于本机”会显示一个标有“芯片”的项目并跟有相应芯片的名称: 通过命令行检查Mac的CPU类型 …