快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

代码清单5. 登记式单态类的子类。

在GoF原始的例子中,并没有getInstance()方法,这样得到子类必须调用文类的getInstance(String name) 方法,并传入子类的名字,很不方便。作者在登记式单态类子类的例子里,加入了getInstance()方法,这样做的好处是RegSingletonChild 可以通过这个方法,返还自已的实例,而这样做的缺点是,由于数据类型不同,无法在RegSingleton提供 这样一个方法。

由于子类必须充许父类以构造子调用产生实例,因此它的构造子必须是公开的。这样一来,就等于允许了 以这样方式产生实例而不在父类的登记中。这是登记式单态类的一个缺点。

GoF曾指出,由于父类的实例必须存在才可能有子类的实例,这在有些情况下是一个浪费。这是登记式单态类的另一个缺点。

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

时间:2010-12-17

Java语言里的垃圾回收

Java语言里垃圾回收使得单态类的使用变得有点复杂。原因就在于JDK1.1版里加进去的类的自动清除。这种类的垃圾回收会清除掉类本身,而不仅仅是对象!事实上JDK1.1甚至可以清除掉一些系统类!

在JDK1.0.x版本里,类的自动清除尚未加入。

在JDK1.2及以后的版本里,升阳公司又收紧了类的垃圾回收规则,它规定,所有通过局部的和系统的 类加载器加载的类,永不被回收。并且,通过其它类加载器加载的类,只有在加载器自己被回收后才可被回收。

在1.1版JDK里使用单态类的读者,如果不了解这一版Java语言的特点,很有可能会遇到类消失掉的奇特问题。为了使你的单态类能在所有版本的Java环境里使用,作者特别提供一个"看守"类程序,它能保证你的单态类, 甚至其它任何对象,一旦交给"看守"对象,即不会莫名其妙地被垃圾回收器回收,直到你把它从"看守" 那里把它释放出来。

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

图6. "看守"类的一个例子

package com.javapatterns.singleton.demos; import java.util.Vector; /** * This class keeps your objects from garbage collected */ public class ObjectKeeper extends Thread {   private ObjectKeeper()   {    new Thread(this).start();   }   public void run()   {    try { join(); }    catch (InterruptedException e) {}   }   /**   * Any object passed here will be kept until you call discardObject()   */   public static void keepObject(Object myObject)   {    System.out.println(" Total number of kept objects: " +              m_keptObjects.size());    m_keptObjects.add(myObject);    System.out.println(" Total number of kept objects: " +               m_keptObjects.size());   }   /**   * This method will remove the protect of the object you pass in and make it   * available for Garbage Collector to collect.   */   public static void discardObject(Object myObject)   {    System.out.println(" Total number of kept objects: " +              m_keptObjects.size());    m_keptObjects.remove(myObject);    System.out.println(" Total number of kept objects: " +              m_keptObjects.size());   }   private static ObjectKeeper m_keeper = new ObjectKeeper();   private static Vector m_keptObjects = new Vector(); }

代码清单6. 看守类的一个实现。

看守类应当自我实例化,而且在每个系统里只需一个实例。这就意味着看守类本身就应当是单态类。当然,类 消失的事情绝不可以发生在它自己身上。作者提供的例子刚好满足所有的要求。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号