本文介绍Java中23个设计模式中的单例模式。
一 概念
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
二 作用
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
三 要点
单例模式的要点有三个:
1. 某个类只能有一个实例;
2. 它必须自行创建这个实例;
3. 它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:
1. 单例模式的类只提供私有的构造函数;
2. 类定义中含有一个该类的静态私有对象;
3. 该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
四、类图
五、实现
由于建立单例对象的时间不同,可以将单例模式分为“懒汉式”和“饿汉式”两种单例模式。
1、懒汉式单例
// 懒汉式单例,在第一次被调用的时候实例化自己
public class Singleton {
private static Singleton single = null;
private Singleton() {}
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
2、饿汉式单例
// 饿汉式单例,在类初始化时就已经实例化自己
public class Singleton {
private static final Singleton single = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return single;
}
}
六、JDK中单例类
- java.lang.Runtime#getRuntime()
- java.awt.Toolkit#getDefaultToolkit()
- java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
- java.awt.Desktop#getDesktop()