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

    单例模式分为三类:饿汉式单例,懒汉式单例,登记式单例

    单例模式的特点:

    1,单例类只能有一个实例

    2,单例类必须自己创建自己的唯一实例

    3,单例类必须给所有其他对象提供这一实例

    单例模式类图

     

    一,懒汉式单例

    /*
     * 单例模式----懒汉式单例
     *
     * 在类被加载的时候,唯一实例已经被创建
     *
     */

    public class LazySingleton {
     
     /*
      * 私有静态对象,加载时候不做初始化
      */
     private static LazySingleton m_intance=null;
     
     /*
      * 私有构造方法,避免外部创建实例
      */
        private LazySingleton(){
        }
       
        synchronized public static LazySingleton getInstance()
        {
         if(m_intance==null)
         {
          m_intance=new LazySingleton();
         }
         
         return m_intance;
        }
    }

    二,饿汉式单例

    /*
     * 单例模式----饿汉式单例
     *
     * */
    public class EagerSingleton {

     /*
      * 私有的唯一实例成员,在类加载的时候就创建好了单例对象
      * */
     private static final EagerSingleton m_instance=new EagerSingleton();
     
     /*
      * 私有构造方法,避免外部创建实例
      * */
     private EagerSingleton(){}
     
     /*
      * 静态工厂方法,返回此类的唯一实例
      * */
     public static EagerSingleton getInstance()
     {
      return m_instance;
     }
    }

    三,登记式单例

    import java.util.HashMap;
    import java.util.Map;
    /*
     * 单例模式----登记式单例
     *
     * 这个单例实际上维护的是一组单例类的实例,将这些实例存放在一个Map中
     * 对于已经登记过的实例,则从工厂直接返回,对于没有登记的,则先登记,而后返回
     * */
    public class RegSingleton {
     
     /*
      * 登记簿,用来存放所有登记的实例
      * */

      private static Map<String,RegSingleton> m_registry=new HashMap();
     
      //在类加载的时候加一个实例到登记簿
      static {
       RegSingleton x=new RegSingleton();
       m_registry.put(x.getClass().getName(),x);
      
      }
     
      /*
       * 受保护的默认构造方法
       * */
      protected RegSingleton(){}
     
      /*
       * 静态工厂方法,返回指定登记对象的唯一实例
       * 对于已登记的直接取出返回,对于未登记的,先登记,然后取出返回
       * */
      public static RegSingleton getInstance(String name)
      {
       if(name==null)
       {
        name="RegSingleton";
       }
       if(m_registry.get(name)==null)
       {
       try
       {
        m_registry.put(name,(RegSingleton)Class.forName(name).newInstance());
       }catch(InstantiationException e)
       {
        e.printStackTrace();
       }catch(IllegalAccessException e)
       {
        e.printStackTrace();
       }catch(ClassNotFoundException e)
       {
           e.printStackTrace(); 
       }
       }
       return m_registry.get(name);
      }
    }
          懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境,同样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。

         

  • 相关阅读:
    css应用视觉设计
    HTML中name、id、class的区别介绍
    css怎么选择父元素下的某个元素?
    css权重如何计算的?
    如何更有效的消灭watchdogs挖矿病毒?华为云DCS Redis为您支招
    分布式缓存Redis应用场景解析
    【云速建站】让你轻轻松松建立属于自己的网店
    一张图读懂什么是专属分布式存储
    【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(2)
    【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(1)
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1932719.html
Copyright © 2011-2022 走看看