单例模式



设计模式学习--单件模式



这个模式似乎没有产生新的设计原则,不过还是回顾以下吧:

1. 封装变化

2. 多用组合,少用继承

3. 针对接口编程,不针对实现编程

4. 为交互对象之间的松耦合设计而努力

5. 类应该扩展开放,对修改关闭

6. 依赖抽象,不要依赖具体类



单例模式---确保一个类只有一个实例,并提供全局访问点。


要点:

  • 单件模式确保程序中一个类最多只有一个实例。
  • 单件模式也提供访问这个实例的全局点。
  • 在Java中实现单件模式需要私有的构造器、一个静态方法和一个静态变量。
  • 确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程问题(我们必须认定所有的程序都是多线程的)。
  • 如果不采用第5版的Java 2,双重检查加锁实现会失效。
  • 小心,你如果使用多个类加载器,可能导致单件失效而产生多个实例。
  • 如果使用JVM 1.2或之前的版本,你必须简历单件注册表,以免垃圾收集器将单件回收。


[java] view plain copy print ?
  1. package singleTonPattern;  
  2.   
  3. /** 
  4.  * 2013/6/6 
  5.  *  
  6.  * @author wwj 单例模式 
  7.  */  
  8. public class Singleton {  
  9.     // 利用一个静态变量来记录Singleton类的唯一实例  
  10.     private static Singleton uniqueInstance;  
  11.     // 把构造器声明为私有的,只有自Singleton类内才可以调用构造器  
  12.     private Singleton(){};  
  13.     /** 
  14.      * 用这个方法实例化对象,并返回这个实例 
  15.      * @return 
  16.      */  
  17.     public static Singleton getInstance() {  
  18.         if(uniqueInstance == null) {  
  19.             uniqueInstance = new Singleton();  
  20.         }  
  21.         return uniqueInstance;  
  22.     }  
  23.       
  24.     /** 
  25.      * 使用同步的方法,解决多线程灾难 
  26.      * 但这种方法会影响程序执行效率 
  27.      * @return 
  28.      *//* 
  29.     public static synchronized Singleton getInstance() { 
  30.         if(uniqueInstance == null) { 
  31.             uniqueInstance = new Singleton(); 
  32.         } 
  33.         return uniqueInstance; 
  34.     }*/  
  35.       
  36.     /** 
  37.      * 使用“急切”创建实例,而不用延迟实例化的做法 
  38.      */  
  39. /*  private static Singleton uniqueInstance = new Singleton(); 
  40.      
  41.     public static Singleton getInstance() { 
  42.         return uniqueInstance; 
  43.     }*/  
  44.       
  45.       
  46.     /** 
  47.      * 用“双重检查加锁”,在getInstance()中减少使用同步 
  48.      * 如果性能是你关心的重点,这种做法可以帮你大大减少getInstance()的时间耗费 
  49.      */  
  50.     /*private volatile static Singleton uniqueInstance; 
  51.      
  52.     public static Singleton getInstance() { 
  53.         if(uniqueInstance == null) { 
  54.             synchronized (Singleton.class) { 
  55.                 if(uniqueInstance == null) { 
  56.                     uniqueInstance = new Singleton; 
  57.                 } 
  58.             } 
  59.         } 
  60.     }*/  
  61. }  


使用实例:巧克力工厂

[java] view plain copy print ?
  1. package singleTonPattern;  
  2.   
  3. /** 
  4.  * 巧克力工厂 
  5.  * @author wwj 
  6.  * 使用单实例对象 
  7.  * 经典的单件模式,不适用于多线程的情况,因为可能会产生多个不同的对象,解决办法,实现同步方法 
  8.  */  
  9. public class ChocolateBoilder {  
  10.     private boolean empty;  
  11.     private boolean boiled;  
  12.     private static ChocolateBoilder unqueInstance;  
  13.       
  14.     public ChocolateBoilder() {  
  15.         empty = true;  
  16.         boiled = false;  
  17.     }  
  18.   
  19.     /** 
  20.      * 确保一个类只有一个实例,并提供一个全局访问点 
  21.      * @return 
  22.      * 如果要解决多线程问题的话,可以将这个方法声明为Sychronized 
  23.      */  
  24.     public static ChocolateBoilder getInstance() {  
  25.         if(unqueInstance == null) {  
  26.             unqueInstance = new ChocolateBoilder();  
  27.         }  
  28.         return unqueInstance;  
  29.     }  
  30.       
  31.     public void fill() {  
  32.         if(isEmpty()) {  
  33.             empty = false;  
  34.             boiled = false;  
  35.             // 在锅炉内填满巧克力和牛奶的混合物  
  36.         }  
  37.     }  
  38.       
  39.     public void drain() {  
  40.         if(!isEmpty() && !isBoiled()) {   
  41.             //排除煮沸的巧克力和牛奶  
  42.             empty = true;  
  43.         }  
  44.     }  
  45.       
  46.     public void boil() {  
  47.         if(!isEmpty() && !isBoiled()){  
  48.             // 将炉内物煮沸  
  49.             boiled = true;  
  50.         }  
  51.     }  
  52.       
  53.     public boolean isEmpty() {  
  54.         return empty;  
  55.     }  
  56.       
  57.     public boolean isBoiled() {  
  58.         return boiled;  
  59.     }  
  60. }  

你可能感兴趣的:(单例模式)