相信我,Singleton模式是所有设计模式中类图最简单的模式之一。
Singleton模式在实现方式上有一个有趣的机制。因此,在我们的代码中实现单子模式之前,首先让我们深入了解其定义,即
"单子模式确保一个类只有一个实例,并为其提供一个全局访问点"。
上述定义指向两件事,让我们把它们分解开来:
-
你有一个类,你让它管理自己的一个实例,同时你也阻止任何其他类创建自己的新实例,为了获得一个实例,你必须通过该类本身。
-
第二件事是,你还提供了一个全局的实例访问点,这样,无论何时你需要一个实例,只要问一下这个类,它就会把这个单一的实例交还给你。因此,我们可以看到,你正在以一种懒惰的方式创建Singleton,这对于资源密集型的对象来说是非常重要的。
现在,为了更清楚地了解单子模式,让我们了解一下单子模式的类图。
| 单体 |
| static Singleton instance // Other useful Singleton Data ... |
| static Singleton getInstance() // Other useful Singleton Methods ... |
单子类图
单子类图
在上图中,你有一个Singleton类,这个类里面的内容非常有趣,这里有一个关于Singleton模式的关键,就是我们把Singleton类的构造函数 设为"私有" ,这是非常独特的,这样做的结果是,从外部来看,人们无法构造一个新的类,只有Singleton可以实例化Singleton。
现在你们都会想,如果我们不能使用新的Singleton来制造一个单子,那么我们到底要怎样来创建第一个单子,这时静态方法就出现了。
静态方法是一个在单子类命名空间下的类方法,因此它可以访问一个私有的构造函数,因此你可以实例化,例如
Singleton.getInstance()
现在我们已经理解了单子模式是如何工作的,是时候看看伪代码了。
伪代码 -:
public class Singleton {
static private Singleton instance;
/*
static private variable called instance that hold something of type Singleton
*/
private Singleton() {}
/*
private constructor which result's you can't instantiate class from outside
*/
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
/*
public static method that return the singleton and is called getInstance
*/
}
...
}
现在我们已经了解了单子模式的工作原理,让我们跳进IntelliJ,尝试在我们的代码中实现单子模式。
使用Singleton模式的Scala程序
package com.knoldus.singleton
import java.util.Calendar
import java.text.SimpleDateFormat
object DataUtils extends App{
def getCurrentDate: String = getCurrentDateTime("Monday, July 5")
def getCurrentTime: String = getCurrentDateTime("10:00 a.m.")
private def getCurrentDateTime(dateTimeFormat: String): String = {
val dateFormat = new SimpleDateFormat(dateTimeFormat)
val cal = Calendar.getInstance()
dateFormat.format(cal.getTime())
}
}
结论
我希望通过阅读这篇文章,你能够掌握单子模式的概念,现在你一定已经理解了为什么我们把单子模式称为 "独一无二的模式"。