单例模式(Singleton)

http://www.cnblogs.com/wangjq/archive/2012/06/28/2561250.html  设计模式学习笔记-单例模式
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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值