首页 > 其他 > 详细

设计模式GOF23之单例模式实现

时间:2015-03-27 08:52:31      阅读:204      评论:0      收藏:0      [点我收藏+]
package com.bjsxt.cn.singleton;
/**
 * 饿汉式创建单例模型
 * 饿汉式单例模型的特点:
 *  1, 私有的该类对象静态属性
 *  2, 私有的构造器
 *  3, 公共的静态方法访问静态属性(因此需要时静态的环境)
 * @author wanna
 *
 */
public class SingletonDemo1 {
 //饿汉式,饿,非常饿,上来就吃了
 //类初始化的时候,立即加载这个对象(没有延时加载的能力)。如果加载该类非常复杂,而在之后却又并没有访问该对象,造成资源的狼粪
 //由于加载类是天然线程安全的,所以饿汉式单例模式线程安全
 private static SingletonDemo1 instance = new SingletonDemo1();
 
 private SingletonDemo1() {
 
 }
 
 //该访问方法没有同步synchronized,因此调用效率高
 public static SingletonDemo1 getInstance() {
  return instance;

 }
}



package com.bjsxt.cn.singleton;
/**
 * 2015年3月26日22:14:30
 * 懒汉式单例模式
 * 该懒汉式的特点是:
 *  1, 构造器私有
 *  2, 私有静态属性,类型为该类的对象,但是在声明时并没有初始化。因为Lazy load。因为懒惰
 *  3, 静态访问私有的那个静态属性的静态方法。但是在该方法体中先要检查该静态属性是否为空,为空则new,否则直接返回
 * 
 * @author wanna
 *
 */
public class SingletonDemo2 {
 private SingletonDemo2() {
  
 }
 
 private static SingletonDemo2 instance;
 
 //因为该方法加了同步synchronized,效率低,但是具有延时加载的能力。提高了资源的利用率
 public static synchronized SingletonDemo2 getInstance() {
  if (instance == null) {
   instance = new SingletonDemo2();
  }
  return instance;
  
 }
}


package com.bjsxt.cn.singleton;
/**
 * 2015年3月26日22:14:38
 * 
 * 测试双重检测锁式单例模式
 * 双重检测锁式单例模式的特点与懒汉式相似,但最重要的区别是在访问静态属性的实例时的过程
 * 
 * 但是由于编译器底层优化和JVM内部模型,偶尔会出问题,不建议使用
 * @author wanna
 *
 */
public class SingletonDemo3 {
 private static SingletonDemo3 instance = null;
 
 private SingletonDemo3() {
  
 }
 
 //该方法把懒汉式单例模式中的synchronized同步下移到if中,提高了执行效率,不用每次获取对象时都需要进行同步。
 //只有第一次创建需要同步,之后就不需要了。
 public static SingletonDemo3 getInstance() {
  if (instance == null) {
   SingletonDemo3 sc;
   synchronized(SingletonDemo3.class) {
    sc = instance;
    if (sc == null) {
     synchronized(SingletonDemo3.class) {
      if (sc == null) {
       sc = new SingletonDemo3();
       
      }
      
     }
     instance = sc;
    }
   }
  }
  return instance;
  
 }
}



package com.bjsxt.cn.singleton;
/**
 * 2015年3月26日22:14:45
 * 静态内部类实现单例模式
 * 这种方式线程安全,执行效率高,并且可以延时加载
 * 特点:
 *  1, 构造器私有
 *  2, 静态属性修改为静态内部类,在内部类中定义了外部类的静态final属性(好像删去final也不影响)
 *  3, 静态访问静态属性的方法,在方法体重返回在内部类new出来的外部封装类对象。也就实现了延时加载 
 * @author wanna
 *
 */
public class SingletonDemo4 {

 
 private static class SingltonClassInstance {
  private static SingletonDemo4 instance = new SingletonDemo4(); 
 }
 
 public static SingletonDemo4 getInstance() {
  return SingltonClassInstance.instance;
  
 }
 private SingletonDemo4() {
  
 }
}




package com.bjsxt.cn.singleton;

/**
 * 测试枚举实现单例模式(没有延时加载)
 * @author wanna
 *
 */
public enum SingletonDemo5 {
 Instance;//该枚举元素本身就是单例对象
 
 //添加自己需要的操作
 public void operation() {
  
 }
}


设计模式GOF23之单例模式实现

原文:http://blog.csdn.net/lk142500/article/details/44657951

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!