单例模式

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
 




posted @ 2013-11-12 17:32  tanhaiyuan  阅读(142)  评论(0编辑  收藏  举报