单例模式
http://www.cnblogs.com/ykt/archive/2011/11/24/2261251.html [读书笔记] 单例模式的几种实现方式
《漫谈设计模式》
一: 概述
保证一个类仅有一个实例, 并提供一个访问它的全局访问点。
二: 适用条件
三: 模式解读
(一)类图
(一)类图
(二) 实现特点
(1)类对象放在类内部, 由类本身控制对象实例化
(2)将构造方法设为私有, 防止外部调用它实例化别的对象
(3)提供一个全局访问点, 即提供一个静态类型的访问方法
(三)模式代码实现
共六种方式:
第一种
public class Singleton{
private static Singleton uniqueInstance = new Singleton();
private Singleton(){
//将默认构造函数定义为私有,防止外部调用它实例化别的对象
}
public static Singleton getInstance(){
return uniqueInstance;
}
}缺点: 客户端可以借助AccessibleObject.setAccessible方法,通过反射来调用私有构造器。解决方法:可以修改构造器,让其在被要求创建第二个实例的时候抛出异常
第二种
public class Singleton{
private static Singleton uniqueInstance;
private Singleton(){
//将默认构造函数定义为私有,防止外部调用它实例化别的对象
}
public static Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton()
}
return uniqueInstance;
}
}
第三种 : 将第二种的访问对象方法通过synchronized锁定
public static synchronized Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton()
}
return uniqueInstance;
} 第四种 :
public class DoubleCheckSingleton{
private static DoubleCheckSingleton uniqueInstance;
private DoubleCheckSingleton(){
//将默认构造函数定义为私有,防止外部调用它实例化别的对象
}
public static DoubleCheckSingleton getInstance(){
if(uniqueInstance == null){
synchronized(DoubleCheckSingleton.class){
if(uniqueInstance == null)
uniqueInstance = new DoubleCheckSingleton()
}
}
return uniqueInstance;
}
}
第五种
public class LazyLoadSingleton{
private LazyLoadedSingleton(){
}
private static class LazyHolder{
private static LazyLoadedSingleton uniqueSingleton = new LazyLoadSingleton();
}
public static Singleton getInstance(){
return LazyHolder.uniqueSingleton;
}
}
第六种
枚举实现
public enum Singleton{
UniqueInstance;
public void printFunction{
System.out.println("test");
}
}
优点:更简洁,无偿的提供了序列化机制。绝对防止多次实例,
即使面对复杂序列化或者反射攻击的时候
即使面对复杂序列化或者反射攻击的时候
四: 模式总结
优点
缺点
优点
缺点
应用实例
重构中的应用
相关模式 (区别联系)
2013年8月15日 14:20:13