单例模式:一个类只有一个实例。
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
单例模式的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式包含的角色只有一个,就是单例类——Singleton。单例类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化它。除此之外,该模式中包含一个静态私有成员变量与静态公有的工厂方法,该工厂方法负责检验实例的存在性并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
示例代码:
public class Singleton
{
private static Singleton instance=null; //静态私有成员变量
//私有构造函数
private Singleton()
{
}
//静态公有工厂方法,返回唯一实例
public static Singleton getInstance()
{
if(instance==null)
instance=new Singleton();
return instance;
}
}
以上单例模式存在很大的问题,在多线程下会出错。
==============================分割线==========================================
在实际的项目中用到比较多的单例模式就是双重检测(DCL)和静态内部类方式的单例模式。这两种方式的单例可以解决在多线程中的数据同步问题。特别的对于支持序列化的单例类 需要避免反序列化生成多个对象。具体示例代码如下所示:
DCL方式:
public class Singleton implements Serializable{
private volatile static Singleton singleton;
private Singleton(){
}
public static Singleton getInstance(){
if(null==singleton){
synchronized (Singleton.class){
if (null==singleton){
singleton=new Singleton();
}
}
}
return singleton;
}
// 防止反序列化获取多个对象
private Object readResolve() throws ObjectStreamException {
return singleton;
}
}
静态内部类方式:
//第一次加载不会初始化
public class Singleton4Static implements Serializable{
private Singleton4Static(){
}
private static class Holder{
private static final Singleton4Static sInstance=new Singleton4Static();
}
//第一次调用该方法才会初始化
public static Singleton4Static getInstance(){
return Holder.sInstance;
}
// 防止反序列化获取多个对象
private Object readResolve() throws ObjectStreamException {
return Holder.sInstance;
}
}