什么是设计模式?
设计模式是我们软件工程师经常遇到的反复出现的问题的设计级解决方案。这不是代码 - 我再说一遍,❌代码。这就像是关于如何解决这些问题和设计解决方案的描述。
使用这些模式被认为是很好的做法,因为解决方案的设计经过了相当多的尝试和测试,从而提高了最终代码的可读性。设计模式通常是为OOP语言创建和使用的,比如Java,从这里开始的大多数示例都将被编写出来。
设计模式的类型
目前发现了大约26种模式(我几乎不认为我会全部完成它们......)。
这26种可分为3种类型:
1. 创建:这些模式是为类实例化而设计的。它们可以是类创建模式或对象创建模式。
2.结构:这些模式是根据类的结构和组成而设计的。大多数这些模式的主要目标是增加所涉及的类的功能,而不改变其大部分组成。
3.行为:这些模式是根据一个班级如何与其他班级交流而设计的。
在这篇文章中,我们将介绍每种分类类型的一个基本设计模式。
类型 1:创造 - 单例设计模式
单例设计模式是一种创建模式,其目标是仅创建一个类的一个实例,并且仅提供该对象的一个全局访问点。Java中此类的一个常用示例是日历,您无法在其中创建该类的实例。它还使用自己的方法来获取要使用的对象。getInstance()
使用单例设计模式的类将包括:
单例类图
一个私有静态变量,保存类的唯一实例。
私有构造函数,因此无法在其他任何位置实例化它。
一个公共静态方法,用于返回类的单个实例。
单例设计有许多不同的实现。今天,我将介绍的实现;
1. 急切实例化
2. 惰性实例化
3. 线程安全实例化
雄心勃勃的人
这种类型的实例化发生在类加载期间,因为变量实例的实例化发生在任何方法之外。如果客户端应用程序根本没有使用此类,这将带来巨大的缺点。如果未使用此类,则应急计划是惰性实例化。
懒惰的日子
与上述实现没有太大区别。主要区别在于,静态变量最初声明为 null,并且仅当实例变量在检查时保持空值时,才在方法中实例化。getInstance()
这修复了一个问题,但另一个问题仍然存在。如果两个不同的客户端同时访问单例类,正好是毫秒,该怎么办?好吧,他们将同时检查实例是否为空,并会发现它是真的,因此将为两个客户端的每个请求创建两个类实例。为了解决这个问题,将实现线程安全实例化。
(螺纹)安全是关键
在 Java 中,关键字 synchronized 用于方法或对象以实现线程安全,以便一次只有一个线程访问特定资源。类实例化放在同步块中,以便该方法在给定时间只能由一个客户端访问。
同步方法的开销很高,并且会降低整个操作的性能。
例如,如果实例变量已实例化,则每次任何客户端访问该方法时,都会运行该方法并降低性能。发生这种情况只是为了检查变量的值是否为空。如果它发现它是,它将离开该方法。getInstance() synchronized instance
为了减少此开销,使用双重锁定。该检查也先于该方法使用,如果该值仅为 null,则该方法是否运行。synchronized synchronized