知识大全 爪哇语言单态创立性模式介绍(下)

Posted

篇首语:勤劳一日,可得一夜安眠;勤劳一生,可得幸福长眠本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 爪哇语言单态创立性模式介绍(下)相关的知识,希望对你有一定的参考价值。

  登记式单态类   登记式单态类是GoF为了克服饿汉式单态类及懒汉式式单态类均不可继承的缺点而设计的 作者把他们的例子翻译为爪哇语言 并将它自己实例化的方式从懒汉式改为饿汉式 只是它的 子类实例化的方式只能是懒汉式的 这是无法改变的       图 登记式单态类的一个例子   图中的关系线表明 此类自已将自己实例化   package javapatterns singleton demos;   import java util HashMap;  public class RegSingleton    protected RegSingleton()    static public RegSingleton getInstance(String name)     if (name == null)     name = 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 ;       代码清单 登记式单态类 (注意为简单起见 这里没有考虑多线程访问限制的问题 读者可自行加入一个有双重 检查的访问限制)   它的子类       图 登记式单态类子类的一个例子   图中的关系线表明 此类是由父类将自己实例化的    package javapatterns singleton demos;   import java util HashMap;  public class RegSingletonChild extends RegSingleton     public RegSingletonChild()    static public RegSingletonChild getInstance()     return (RegSingletonChild) RegSingleton getInstance(   javapatterns singleton demos RegSingletonChild );      public String about()     return Hello I am RegSingletonChild ;       代码清单 登记式单态类的子类   在GoF原始的例子中 并没有getInstance()方法 这样得到子类必须调用文类的getInstance(String name) 方法 并传入子类的名字 很不方便 作者在登记式单态类子类的例子里 加入了getInstance()方法 这样做的好处是RegSingletonChild 可以通过这个方法 返还自已的实例 而这样做的缺点是 由于数据类型不同 无法在RegSingleton提供 这样一个方法   由于子类必须充许父类以构造子调用产生实例 因此它的构造子必须是公开的 这样一来 就等于允许了 以这样方式产生实例而不在父类的登记中 这是登记式单态类的一个缺点   GoF曾指出 由于父类的实例必须存在才可能有子类的实例 这在有些情况下是一个浪费 这是登记式单态类的另一个缺点   爪哇语言里的垃圾回收   爪哇语言里垃圾回收使得单态类的使用变得有点复杂 原因就在于JDK 版里加进去的类的自动清除 这种类的垃圾回收会清除掉类本身 而不仅仅是对象!事实上JDK 甚至可以清除掉一些系统类!   在JDK x版本里 类的自动清除尚未加入   在JDK 及以后的版本里 升阳公司又收紧了类的垃圾回收规则 它规定 所有通过局部的和系统的 类加载器加载的类 永不被回收 并且 通过其它类加载器加载的类 只有在加载器自己被回收后才可被回收   在 版JDK里使用单态类的读者 如果不了解这一版爪哇语言的特点 很有可能会遇到类消失掉的奇特问题 为了使你的单态类能在所有版本的爪哇环境里使用 作者特别提供一个 看守 类程序 它能保证你的单态类 甚至其它任何对象 一旦交给 看守 对象 即不会莫名其妙地被垃圾回收器回收 直到你把它从 看守 那里把它释放出来      图 看守 类的一个例子   package 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();     代码清单 看守类的一个实现   看守类应当自我实例化 而且在每个系统里只需一个实例 这就意味着看守类本身就应当是单态类 当然 类 消失的事情绝不可以发生在它自己身上 作者提供的例子刚好满足所有的要求   一个实用的例子   这里作者给出一个读取属性(properties)文件的单态类 作为单态类的一个实用的例子 属性文件如同老式的视窗编程时的 ini文件 属于系统的 资源 而读取属性文件即为资源管理 显然应当由一个单态类负责      图 这个例子的UML   显然 在大多数的系统中都会涉及属性文件的读取问题 因而这个例子非常有实用价值 在这个例子里 作者假定需要读取的属性文件就在当前目录中 且名为singleton properties 在这个文件中有如下的一些属性项   em =How  em =are  em =you  em =doing  em =?   代码清单 属性文件内容   本例子的源代码如下   package javapatterns singleton demos;   import java util Properties;  import java io FileInputStream;  import java io File;  public class ConfigManager     /**   * 私有的构造子 用以保证实例化的唯一性   */   private ConfigManager()     m_file = new File(PFILE);  m_lastModifiedTime = m_file lastModified();  if(m_lastModifiedTime == )     System err println(PFILE + file does not exist! );    m_props = new Properties();  try     m_props load(new FileInputStream(PFILE));    catch(Exception e)     e printStackTrace();        /**   *   * @return 返还ConfigManager类的单一实例   */   synchronized public static ConfigManager getInstance()     return m_instance;      /**   * 读取一特定的属性项   *   * @param name 属性项的项名   * @param defaultVal 属性项的缺省值   * @return 属性项的值(如此项存在) 缺省值(如此项不存在)   */   final public Object getConfigItem(String name Object defaultVal)     long newTime = m_file lastModified();  // 检查属性文件是否被其它程序(多数情况是程序员手动)修改过   // 如果是 重新读取此文件   if(newTime == )     // 属性文件不存在   if(m_lastModifiedTime == )       System err println(PFILE + file does not exist! );      else       System err println(PFILE + file was deleted!! );      return defaultVal;    else if(newTime > m_lastModifiedTime)     m_props clear cha138/Article/program/Java/gj/201311/27517

相关参考

知识大全 爪哇语言抽象工厂创立性模式介绍

  工厂模式有简单工厂模式工厂方法模式和抽象工厂模式几种形态其中简单工厂模式和工厂方法模式已经在前面作过介绍在这里我们来介绍抽象工厂模式  抽象工厂模式是所有形态的工厂模式中最为抽象和最具广泛性的一种

知识大全 爪哇语言工厂方法创立性模式介绍(上)

  正如同笔者在一节里介绍的工厂模式有简单工厂模式工厂方法模式和抽象工厂模式几种形态简单工厂模式已经在前面作过介绍在简单工厂模式中一个工厂类处于对产品类实例化调用的中心位置上它决定那一个产品类应当被实

知识大全 爪哇语言结构性模式之变压器模式介绍(下)

  抽象类WindowAdapter是变压器模式的一个例子  抽象类WindowAdapter是为接受视窗的事件而准备的此抽象类内所有的方法都是空的使用此类可以很方便地创立listener对象置换(O

知识大全 爪哇语言观察者模式介绍

  简单地说观察者模式定义了一个一对多的依赖关系让一个或多个观察者对象监察一个主题对象这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象使这些观察者对象能够自动更新  观察者模式

知识大全 爪哇语言结构性模式之变压器模式介绍(上)

  什么是结构性模式  结构性模式描述类和对象怎样结合在一起成为较大的结构结构性模式描述两种不同的东西类与类的实例根据它们所描述的东西的不同结构性模式可以分为类结构模式和实例结构模式两种  类结构模式

知识大全 Java中的模式--单态

Java中的模式--单态  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  单态定义:  Singl

知识大全 设计模式之Singleton(单态模式)

设计模式之Singleton(单态模式)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要讨论

知识大全 解析在zend Farmework下如何创立一个FORM表单

解析在zendFarmework下如何创立一个FORM表单  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 用Delphi语言来学设计模式之简单工厂篇

用Delphi语言来学设计模式之简单工厂篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 java的10种设计模式介绍

   正常情况下一个设计模式描述了一个被证实可行的方案这些方案非常普遍是具有完整定义的最常用的模式一般模式有个基本要素模式名称(patternname)问题(proble