什么是单例模式?

  单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”

单例模式产生的意义?

  对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文 件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出 多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不 符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

单例模式的要点

单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

  从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

单例模式的形式(这里介绍常用的两种)

1.第一种形式:懒汉式(线程不安全)。

1. public class Singleton {  
2. private static Singleton instance;  
3. private Singleton (){}  
4.   
5. public static Singleton getInstance() {  
6. if (instance == null) {  
7. new Singleton();  
8.     }  
9. return instance;  
10.     }  
11. }

懒汉式(线程安全)。效率很低,且在很少的情况下会用到。

1. public class Singleton {  
2. private static Singleton instance;  
3. private Singleton (){}  
4. public static synchronized Singleton getInstance() {  
5. if (instance == null) {  
6. new Singleton();  
7.     }  
8. return instance;  
9.     }  
10. }


2.第二种形式:饿汉式

1. public class Singleton {  
2. private static Singleton instance = new Singleton();  
3. private Singleton (){}  
4. public static Singleton getInstance() {  
5. return instance;  
6.     }  
7. }

饿汉式和懒汉式区别

从名字上来说,饿汉和懒汉,

饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,

而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。