快速业务通道

Java语言单态创立性模式介绍 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
nce; } private static LazySingleton m_instance = null; }

代码清单3.懒汉式单态类。

Java语言单态创立性模式介绍 - 编程入门网

图3.懒汉式单态类

图中的关系线表明,此类自已将自己实例化。

读者可能会注意到,在上面给出 懒汉式单态类实现里,使用了在多线程编程中常要使用的,著名的双重检查原则。对双重检查原则 和多线程编程要点不十分熟悉的读者,可以看看后面给出的问答题。

同样,由于构造子是私有的,因此此类不能被继承。

饿汉式单态类在自己被加载时就将自己实例化。既便加载器是静态的,在饿汉式单态类被加载时仍 会将自己实例化。单从资源利用效率角度来讲,这是比懒汉式单态类稍差些。从速度和反应时间角度来 讲,则比懒汉式单态类稍好些。然而,懒汉式单态类在实例化时必须处理好在多个线程同时首次引 用此类时,实例化函数内部关键段的访问限制问题。特别是当单态类作为资源控器,在实例化时必然涉及 资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引 用此类的几率变得较大。

饿汉式单态类可以在Java语言内实现,但不易在C++内实现,因为静态初始化在C++里没有固定的顺序, 因而静态的m_instance变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么GoF在提出 单态类的概念时,举的例子是懒汉式的。他们的书影响之大,以致Java语言中单态类的例子也大多是 懒汉式的。实际上,作者认为饿汉式单态类更符合Java语言本身的特点。

Java语言单态创立性模式介绍(4)

时间:2010-12-17

登记式单态类

登记式单态类是GoF为了克服饿汉式单态类及懒汉式式单态类均不可继承的缺点而设计的。作者把他们的例子翻译为Java语言,并将它自己实例化的方式从懒汉式改为饿汉式。只是它的 子类实例化的方式只能是懒汉式的,这是无法改变的。

Java语言单态创立性模式介绍 - 编程入门网

图4. 登记式单态类的一个例子

图中的关系线表明,此类自已将自己实例化。

package com.javapatterns.singleton.demos; import java.util.HashMap; public class RegSingleton {   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) );   }   static private HashMap m_registry = new HashMap();   static   {    RegSingleton x = new RegSingleton();    m_registry.put( x.getClass().getName() , x);   }   public String about()   {    return "Hello, I am RegSingleton.";   } }

代码清单4. 登记式单态类。(注意为简单起见,这里没有考虑多线程访问限制的问题,读者可自行加入一个有双重 检查的访问限制)

它的子类

Java语言单态创立性模式介绍 - 编程入门网

图5. 登记式单态类子类的一个例子。

图中的关系线表明,此类是由父类将自己实例化的。

package com.javapatterns.singleton.demos; 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.";   } }

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号