单例模式是一种创建型的设计模式。单例模式意在保证一个类仅有一个实例,并且提供一个全局的访问点。
一个国家只有一个主席/总统,一个人只有一个名字/身份证号,这些都是单例的例子。稍微实际点的例子就是,在某个服务器程序中,将服务器的配置信息存放在一个文件中,这些配置数据有一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
参与者:
Singleton
—— 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作
—— 可能负责创建它自己的唯一实例
我们先来实现一个简单的单例:
package com.andy.designpattern.singleton; public class Singleton { private static Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
第一个中改进方案是在类装载的时候构建静态单例,请求get的时候直接返回:
package com.andy.designpattern.singleton; public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton() { } public static Singleton getInstance() { return INSTANCE; } }
package com.andy.designpattern.singleton; public class Singleton { private static volatile Singleton INSTANCE = null; private Singleton() { } public static Singleton getInstance() { if (INSTANCE == null) { synchronized (Singleton.class) { if (INSTANCE == null) { INSTANCE = new Singleton(); } } } return INSTANCE; } }这里为什么需要检查两次INSTANCE == null呢?
把INSTANCE声明为volatile有两个作用:
其实单例模式还是比较简单的,就是说一个类只能有一个实例,于是我们把它声明为一个类的类变量,需要使用时判断是否存在,若存在即返回;若不存在,则调用私有构造器构造并返回。
原文:http://blog.csdn.net/lkasdolka/article/details/43113501