Singleton——设计模式中类图最简单的模式之一

168 阅读2分钟

相信我,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())
  }
}

结论

我希望通过阅读这篇文章,你能够掌握单子模式的概念,现在你一定已经理解了为什么我们把单子模式称为 "独一无二的模式"。