本文的目标读者是那些第一次遇到设计模式概念、听说过单例这个术语,或者以某种方式实现了单例模式但不明白发生了什么的人。欢迎!CodeGym 学生第一次遇到设计模式是在第 15 级,当时队长出人意料地要求他们通过使用惰性实现实现 Java 单例模式来“强化”他们的理解。第一次听说单例模式的同学们瞬间会有很多疑问:设计模式到底是什么?我们为什么需要它?什么是单例?最后,什么是惰性实现?让我们按顺序回答这些问题。
而单例模式只是其中之一。
使用二十一点和数字创建自己的排序算法并花很多时间这样做,或者你可以实施一个已经被理解和描述了很长时间的方法。设计模式也是如此。此外,使用设计模式,代码变得更加标准,并且当使用适当的模式时,您犯错误的可能性就会降低,因为很久以前就已经识别并消除了该模式的常见缺陷。最重要的是,模式知识有助于程序员更好地相互理解。您可以简单地说出模式的名称,而不是试图向您的程序员同事提供冗长的解释。总而言之,设计模式可以帮助您:
总结本节,我们注意到整个设计模式可以分为三大类:
世界上什么是设计模式?
我相信一点历史是为了以最好的理解来回答这个问题。有四位著名的编程作者(Erich Gamma、John Vlissides、Ralph Johnson 和 Richard Helm)提出了一个有趣的想法。他们注意到软件开发通常要求他们解决大致相同的问题并编写结构相同的代码。因此他们决定描述在面向对象编程中经常需要使用的典型模式。他们的书于 1994 年以“设计模式:可重用面向对象软件的元素”为标题出版。这本书的名字太长了,人们开始简单地称之为四人帮的书。第一版包括 23 种模式。之后,发现了数十种其他模式。设计模式是针对常见问题的标准化解决方案。 |
为什么我们需要设计模式?
您可以在不知道模式的情况下进行编程:毕竟,到了第 15 级,您已经在 CodeGym 上编写了数百个小程序,甚至不知道它们的存在。这表明设计模式是一种工具,其用法将大师与业余爱好者区分开来:设计模式描述了如何正确解决典型问题。这意味着了解模式可以节省您的时间。这样,它们类似于算法。例如,您可以
|
最后是单例模式
单例模式是一种创建模式。这种模式确保一个类只有一个实例,并为该对象提供一个全局访问点。从描述中可以清楚地看出,这种模式应该应用于两种情况:- 当您的程序要求只创建一个特定类的对象时。例如,一个电脑游戏可能有一个 Hero 类,并且只有一个 Hero 对象来描述游戏中唯一的英雄。
- 当您需要提供一个对象的全局访问点时。换句话说,您需要使该对象在程序的任何地方都可用。las,仅仅创建一个全局变量是不够的,因为它没有写保护:任何人都可以更改变量的值,因此对象的全局访问点可能会丢失。Singleton的这些属性是必需的,例如,当您有一个与数据库一起工作的对象时,您需要从程序的不同部分访问数据库。单例将确保没有人编写代码来替换先前创建的实例。
-
查找具有惰性初始化的单例示例。
-
使用相同的原则在不同的文件中创建三个单例类——Sun、Moon、Earth。
-
实施行星Sun、Moon和Earth类中的接口。
- 在Solution类的静态块中调用readKeyFromConsoleAndInitPlanet方法。
-
实施readKeyFromConsoleAndInitPlanet方法功能:
-
5.1. 从控制台读取一个String参数
-
5.2. 如果参数等于其中之一行星接口的常量,创建合适的thePlanet对象。
-
-
您需要为该类提供一个存储单个对象的私有静态字段:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; // #1 }
-
将(默认)构造函数设为私有。这意味着它不能在类外访问,也不能返回新对象:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton(){} // #2 }
-
声明将用于获取单例的静态创建方法:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton() {} public static LazyInitializedSingleton getInstance() { // #3 if (instance == null) { // If the object has not yet been created instance = new LazyInitializedSingleton(); // Create a new object } return instance; // Return the previously created object } }
GO TO FULL VERSION