java设计模式之单例模式

1.定义
单例模式是对象的创建模式的一种,它保证一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。

2.使用场合
简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类.
(1)配置信息类
负责配置文件的解析,通常被设计为单例类
(2)管理类
如连接池管理类,通常被设计为单例类
(3)控制类,
如struts的ActionServlet类,也是单例类。
如下,只需在web.xml配置以下ActionServlet,tomcat容器自动装载后,即可完成对整个web系统提供ActionServlet实例。
Java代码 
  1. <servlet>  
  2.     <servlet-name>action</servlet-name>  
  3.     <servlet-class>  
  4.          org.apache.struts.action.ActionServlet  
  5.     </servlet-class>          
  6. </servlet>  
  7. <servlet-mapping>  
  8.     <servlet-name>action</servlet-name>  
  9.     <url-pattern>*.do</url-pattern>  
  10. </servlet-mapping>  
    <servlet>         <servlet-name>action</servlet-name>         <servlet-class>              org.apache.struts.action.ActionServlet         </servlet-class>             </servlet>     <servlet-mapping>         <servlet-name>action</servlet-name>         <url-pattern>*.do</url-pattern>     </servlet-mapping>

(4)门面类
说到门面类,就不能不提门面(Facade)模式。客户端与多个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。 这个统一的门面(Facade)对象就是门面类。在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。但这不是绝对 的。
(5)代理类
在Jive中,使用代理模式实现权限访问的入口,就采用了单例模式。

3.单例模式在Java语言的实现
单例模式在Java语言的实现上有三种情况:饿汉式单例类,懒汉式单例类,登记式单例类。
(1)饿汉式单例类
饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类。在类被加载时,就会将自己实例化。
Java代码 
  1. public class Singleton2{     
  2.     //注意这是private   
  3.     private static Singleton2 theInstance = new Singleton2();     
  4.     //这里提供了一个供外部访问本class的静态方法,可以直接访问    
  5.     public static Singleton2 getInstance(){     
  6.         return theInstance;    
  7.     }     
  8. }   
  9.    
public class Singleton2{        //注意这是private      private static Singleton2 theInstance = new Singleton2();        //这里提供了一个供外部访问本class的静态方法,可以直接访问       public static Singleton2 getInstance(){            return theInstance;       }    }   


(2)懒汉式单例类
与饿汉式单例类不同的是,懒汉式单例类在第一次被引用时将自己实例化。
Java代码 
  1. public class Singleton {     
  2.     public static Singleton theInstance = null;     
  3.     private Singleton(){}     
  4.     public synchronized static Singleton instance(){    
  5.         if(theInstance == null){    
  6.             return new Singleton();    
  7.         }    
  8.         return theInstance;    
  9.     }     
  10. }   
  11.    
public class Singleton {        public static Singleton theInstance = null;        private Singleton(){}        public synchronized static Singleton instance(){           if(theInstance == null){               return new Singleton();           }           return theInstance;       }    }   


(3)登记式单例类
登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。
Java代码 
  1. public class RegSingleton    
  2. {    
  3.     static private HashMap m_registry = new HashMap();    
  4.     static    
  5.     {    
  6.         RegSingleton x = new RegSingleton();    
  7.         m_registry.put(x.getClass().getName(), x);    
  8.     }     
  9.     protected RegSingleton(){     
  10.     }     
  11.     static public RegSingleton getInstance(String name)    
  12.     {    
  13.         if (name == null)    
  14.         {    
  15.             name = "com.javapatterns.singleton.demos.RegSingleton";    
  16.         }    
  17.         if (m_registry.get(name) == null)    
  18.         {    
  19.             try    
  20.             {    
  21.                 m_registry.put(name, Class.forName(name).newInstance());    
  22.             }    
  23.             catch (Exception e)    
  24.             {    
  25.                 System.out.println("Error happened.");    
  26.             }    
  27.         }    
  28.         return (RegSingleton) (m_registry.get(name));    
  29.     }     
  30. }  
public class RegSingleton   {       static private HashMap m_registry = new HashMap();       static       {           RegSingleton x = new RegSingleton();           m_registry.put(x.getClass().getName(), x);       }        protected RegSingleton(){        }        static public RegSingleton getInstance(String name)       {           if (name == null)           {               name = "com.javapatterns.singleton.demos.RegSingleton";           }           if (m_registry.get(name) == null)           {               try               {                   m_registry.put(name, Class.forName(name).newInstance());               }               catch (Exception e)               {                   System.out.println("Error happened.");               }           }           return (RegSingleton) (m_registry.get(name));       }    } 

登记式单例类的子类
Java代码 
  1. import java.util.HashMap;  
  2. public class RegSingletonChild extends RegSingleton  
  3. {  
  4. public RegSingletonChild() {}  
  5. static public RegSingletonChild getInstance()  
  6. {  
  7. return (RegSingletonChild)  
  8. RegSingleton.getInstance(  
  9. "com.javapatterns.singleton.demos.RegSingletonChild" );  
  10. }  
  11.   
  12. public String about()  
  13. {  
  14. return "Hello, I am RegSingletonChild.";  
  15. }  
  16. }  
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值