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

迪米特法则: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.hqwc.cn/news/459352.html

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

相关文章

【Git版本控制 02】分支管理

目录 一、创建分支 二、切换分支 三、合并分支 四、删除分支 五、合并冲突 六、分支策略 七、bug分支 一、创建分支 # 当前仓库只有 master 一个主分支 # 可通过 git branch 是进行分支管理的命令,可通过不同参数对分支进行查看、创建、删除(base) [rootloc…

Open CASCADE学习|放样

在CAD(计算机辅助设计)建模中,放样是一种重要的技术,用于将二维图形或设计转化为三维模型。通过放样,设计师可以根据一系列二维剖面和一个或多个引导路径创建出复杂的三维形状。 CAD建模放样的基本步骤如下&#xff1…

TOP100 二叉树(二)

7.108. 将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1: 输入…

【知识图谱--第二讲知识图谱的表示】

知识图谱的表示 知识表示Knowledge Representation 知识表示方法知识图谱的符号表示基于图的知识表示与建模简单图建模-最简单的无向图有向标记图OWL与Ontology 知识图谱的向量表示 知识表示 Knowledge Representation 知识表示(KR)就是用易于计算机处…

『运维备忘录』之 TAR 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

微信小程序(三十八)滚动容器

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.滚动触底事件 2.下拉刷新事件 源码&#xff1a; index.wxml <view class"Area"> <!-- scroll-y 垂直滚动refresher-enabled 允许刷新bindrefresherrefresh 绑定刷新作用函数bindscrollto…

计划任务功能优化,应用商店上架软件超过100款,1Panel开源面板v1.9.6发布

2024年2月7日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.9.6版本。 在v1.9.5和v1.9.6这两个小版本中&#xff0c;1Panel针对计划任务等功能进行了多项优化和Bug修复。此外&#xff0c;1Panel应用商店新增了3款应用&#xff0c;上架精选软件应用超过1…

精讲双向链表的销毁

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

STL常用算法

概述 算法主要由头文件<algorithm>、<numeric>、<functional>构成。 1、<algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到遍历、排序、比较、查找、交换、复制、修改等等。 2、<numeric>体积很小&#xff0c;只包含几个序列上面…

e5 服务器具备哪些性能特点?

随着云计算和大数据技术的不断发展&#xff0c;服务器作为数据中心的核心设备&#xff0c;其性能特点也日益受到关注。其中&#xff0c;E5服务器作为当前主流的服务器类型之一&#xff0c;具备许多优秀的性能特点。本文将详细介绍E5服务器的性能特点&#xff0c;帮助读者更好地…

Mac电脑清空特别大型旧文件如何一键清理?

在我们的数字生活中&#xff0c;Mac电脑常常承载着大量个人资料和重要文件。但当我们决定把自己的Mac送给亲人或朋友使用时&#xff0c;面临的首要任务便是彻底且高效地清空所有个人数据&#xff0c;以保证隐私安全。传统的删除方法虽然简单&#xff0c;但往往不能彻底清除所有…

Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ①

&#x1f4c1; 前情提要&#xff1a; Springboot 整合 Elasticsearch&#xff08;一&#xff09;&#xff1a;Linux下安装 Elasticsearch 8.x Springboot 整合 Elasticsearch&#xff08;二&#xff09;&#xff1a;使用HTTP请求来操作ES 目录 一、Springboot 整合 Elasticsea…