zoukankan      html  css  js  c++  java
  • 单例模式

    http://jatula.javaeye.com/blog/178566
    1.定义

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

        2.使用场合

        简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类.

        (1)配置信息类

        负责配置文件的解析,通常被设计为单例类

        (2)管理类

        如连接池管理类,通常被设计为单例类

        (3)控制类

        如struts的ActionServlet类,也是单例类。

       如下,只需在web.xml配置以下ActionServlet,tomcat容器自动装载后,即可完成对整个web系统提供ActionServlet实例。

    Java代码
    1. action     
    2.      
    3.       org.apache.struts.action.ActionServlet     
    4.              
    5.   
    6.   
    7. action     
    8. *.do     
    action org.apache.struts.action.ActionServlet action *.do

       (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. }

    一. 单例模式
    整理自 《java与模式》阎宏编著


    1.意图:

        确保某个类只有一个实例,并且为该类提供一个全局的访问点。

    2.类图:

      

    3.原理:
        a.将构造函数定义成私有使得不能通过构造函数来创建对象。
        b.定义一个静态的方法提供公共接口,用于访问维一的实例。



    4.特征:
        a.单例类只能有一个实例.
        b.单例类自己创建这个唯一的实例.
        c.单例类必须给所有其他对象提供这个实例.



    5.说明:

       在EJB,JINI,RMI等分布式的java系统中使用单例模式时,尽量不要使用有状态(stateful)的。



    6.使用案例:

        一些资源管理器常常设计成单例模式,这些资源包括外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中管理这些通信端口,以避免一个通信端口被两个请求 同时调用, 回收站等。 内部资源:譬如,系统配置文件管理器,日志管理器,系统记数管理部件,错误输出部件。



    7.代码:

    // Singleton.java

    package singleton;



    public class Singleton

    {

          private static Singleton instance;

          /**

           * 不允许通过构造字来实例化

           */

          private Singleton()

          {

          }



          /**

           * 使用synchronized关键字,保障Singleton的线程安全

           */

          public synchronized static Singleton getInstance()

          {

               if (instance == null)

               {

                     instance = new Singleton();

               }

               return instance;

          }

    }import java.util.HashMap; public class RegSingletonChild extends RegSingleton { public RegSingletonChild() {} static public RegSingletonChild getInstance() { return (RegSingletonChild) RegSingleton.getInstance( "com.javapatterns.singleton.demos.RegSingletonChild" ); } public String about() { return "Hello, I am RegSingletonChild."; } }

  • 相关阅读:
    RDA安装
    关闭SELinux
    Linux下开启关闭防火墙
    长事务管理
    增加复制表
    Python使用property函数定义的属性名与其他实例变量重名会怎么样?
    Python使用property函数定义属性访问方法如果不定义fget会怎么样?
    Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析
    第8.18节 Python类中内置析构方法__del__
    Python中的列表解析和列表推导是一回事吗?
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400756.html
Copyright © 2011-2022 走看看