单例模式主要是为了防止对象不必要/不合理地被创建多次
例如:线程池,打印队列,对话框,部分窗体界面等
单例模式的类有且只能有一个实例化对象
通过简单工厂模式实现单例模式,此方式简便易用但线程不安全
/**
* 单例模式
* 通过工厂模式,在第一次调用时实例化自己
* @author hector
*
*/
public class Singleton {
/**
* 定义private构造器以取代public构造器,阻止此类在外部通过new关键字实例化
*/
private Singleton(){}
/**
* 此类的实例化对象,单例模式应当由自己创建并返回自己的实例化对象
*/
private static Singleton singleton = null;
/**
* 静态工厂模式创建对象,且仅当类中对象为null时执行一次创建
* 对此调用该方法返回的对象为同一个
* @return
*/
public static Singleton getSingleton(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
利用线程锁可以解决这个问题,为静态工厂类增加线程锁,使其在线程上安全
/**
* 静态工厂模式创建对象,且仅当类中对象为null时执行一次创建
* 对此调用该方法返回的对象为同一个
* 通过synchronized锁锁定静态工厂,使得该单例模式创建方式线程安全
* @return
*/
public static Singleton getSingleton(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
但是,众所周知的,线程同步会带来一定的性能上的影响,故此,这样的方式仍然存在一定的问题,一个更优的处理方式是,使用静态内部类完成对象的实例化
/**
* 通过静态内部类创建完成单例类的对象实例化
* 以私有内部类封装对对象的实例化操作,避免外部探知实例化的情况
* 以静态final成员变量确保实例化过程的唯一性
* @author Hector
*/
public class StaticSingleton {
/**
* private构造器阻止该类被外部通过new关键词实例化
*/
private StaticSingleton(){}
/**
* 单例模式获取内部静态类提供的实例化对象
* @return
*/
public static final StaticSingleton getSingleton(){
return StaticSingletonController.SINGLETON;
}
/**
* 由于采用了内部静态类的方式完成实例化,该对象会且只会在该类被加载时被实例化一次
* @author Hector
*/
private static class StaticSingletonController{
/**
* final型的实例化StaticSingleton对象,提供唯一的单例类实例化对象
*/
private static final StaticSingleton SINGLETON = new StaticSingleton();
}
}
此方式规避了多线程同步对于性能的影响,并且实现了在多线程下的线程安全.