单例模式(单子模式)

 一、什么是单例模式?

    在我们的Java应用程序中,随着应用程序的运行会创建出很多对象。但有时候我们希望在创建某类对象时,无论创建多少次该类对象只有一份在内存中。这就是单例模式。如果我们要实现单例模式首先要保证构造函数私有化,即不允许用户随意调用我本类的构造函数,因为只要通过new操作创建对象,必定要在堆中开辟空间,这样就无法实现单例了。

单例类有如下特点:
    § 单例类只有一个实例。
    § 单例类自行创建并提供这个唯一的实例。
单例模式有以下的特点:
    § 单例类只能有一个实例。
    § 单例类必须自己创建自己的惟一的实例。
    § 单例类必须给所有其他对象提供这一实例。

 

二、单例模式的实现

第一种实现方式:

  1. /**  
  2.  * 单例模式(饿汉式单例类) 从速度和反应时间角度来讲,饿汉式单例类稍好  
  3.  * @author Administrator  
  4.  *  
  5.  */  
  6.   
  7. public class Singleton {   
  8.   
  9.     private static Singleton singleton = new Singleton();   
  10.     private String value;   
  11.        
  12.     //构造方法要私有   
  13.     private Singleton(){   
  14.            
  15.     }   
  16.        
  17.     //提供一个对外的方法   
  18.     public static Singleton getSingleton(){   
  19.         return singleton;   
  20.     }   
  21.   
  22.     public String getValue() {   
  23.         return value;   
  24.     }   
  25.   
  26.     public void setValue(String value) {   
  27.         this.value = value;   
  28.     }   
  29.        
  30. }  

第二种实现方法

  1. /**  
  2.  * 单例模式(懒汉式单例类) 单从资源利用效率角度来讲, 懒汉式单例类好些  
  3.  * @author Administrator  
  4.  *  
  5.  */  
  6.   
  7. public class Singleton2 {   
  8.   
  9.     private static Singleton2 singleton = null;   
  10.     private String value;   
  11.        
  12.     //构造方法要私有   
  13.     private Singleton2(){   
  14.            
  15.     }   
  16.        
  17.     //提供一个对外的方法   
  18.     public static Singleton2 getInstance(){   
  19.         if(singleton == null){   
  20.             singleton = new Singleton2();   
  21.         }   
  22.         return singleton;   
  23.     }   
  24.   
  25.     public String getValue() {   
  26.         return value;   
  27.     }   
  28.   
  29.     public void setValue(String value) {   
  30.         this.value = value;   
  31.     }   
  32.        
  33. }  

测试类:

  1. public class Test {   
  2.        
  3.     public static void main(String[] args) {   
  4.            
  5.         Singleton s1 = Singleton.getSingleton();   
  6.         Singleton2 s2 = Singleton2.getInstance();   
  7.         System.out.println(s1.equals(s2));   
  8.         s1.setValue("100");   
  9.         s2.setValue("200");   
  10.         System.out.println(s1.getValue());   
  11.   
  12.     }   
  13.        
  14. }  

 

posted on 2011-07-14 14:24  亲亲美人  阅读(1336)  评论(0编辑  收藏  举报