国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

爪哇語言單態(tài)創(chuàng)立性模式介紹(下)

2019-11-18 12:16:33
字體:
供稿:網(wǎng)友

  登記式單態(tài)類
  登記式單態(tài)類是GoF為了克服餓漢式單態(tài)類及懶漢式式單態(tài)類均不可繼續(xù)的缺點(diǎn)而設(shè)計(jì)的。 作者把他們的例子翻譯為爪哇語言,并將它自己實(shí)例化的方式從懶漢式改為餓漢式。只是它的 子類實(shí)例化的方式只能是懶漢式的,這是無法改變的。
   爪哇語言單態(tài)創(chuàng)立性模式介紹(下)(圖一)


  圖4. 登記式單態(tài)類的一個(gè)例子 
  圖中的關(guān)系線表明,此類自已將自己實(shí)例化。
  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. 登記式單態(tài)類。(注重為簡(jiǎn)單起見,這里沒有考慮多線程訪問限制的問題,讀者可自行加入一個(gè)有雙重 檢查的訪問限制)
  它的子類
   爪哇語言單態(tài)創(chuàng)立性模式介紹(下)(圖二)
  圖5. 登記式單態(tài)類子類的一個(gè)例子。
  圖中的關(guān)系線表明,此類是由父類將自己實(shí)例化的。 
  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.";
   }
  }
  代碼清單5. 登記式單態(tài)類的子類。
  在GoF原始的例子中,并沒有g(shù)etInstance()方法,這樣得到子類必須調(diào)用文類的getInstance(String name) 方法,并傳入子類的名字,很不方便。 作者在登記式單態(tài)類子類的例子里,加入了getInstance()方法,這樣做的好處是RegSingletonChild 可以通過這個(gè)方法,返還自已的實(shí)例,而這樣做的缺點(diǎn)是,由于數(shù)據(jù)類型不同,無法在RegSingleton提供 這樣一個(gè)方法。
  由于子類必須充許父類以構(gòu)造子調(diào)用產(chǎn)生實(shí)例,因此它的構(gòu)造子必須是公開的。這樣一來,就等于答應(yīng)了 以這樣方式產(chǎn)生實(shí)例而不在父類的登記中。這是登記式單態(tài)類的一個(gè)缺點(diǎn)。
  GoF曾指出,由于父類的實(shí)例必須存在才可能有子類的實(shí)例,這在有些情況下是一個(gè)浪費(fèi)。 這是登記式單態(tài)類的另一個(gè)缺點(diǎn)。
  爪哇語言里的垃圾回收
  爪哇語言里垃圾回收使得單態(tài)類的使用變得有點(diǎn)復(fù)雜。原因就在于JDK1.1版里加進(jìn)去的類的自動(dòng)清除。 這種類的垃圾回收會(huì)清除掉類本身,而不僅僅是對(duì)象!事實(shí)上JDK1.1甚至可以清除掉一些系統(tǒng)類!
  在JDK1.0.x版本里,類的自動(dòng)清除尚未加入。
  在JDK1.2及以后的版本里,升陽公司又收緊了類的垃圾回收規(guī)則,它規(guī)定,所有通過局部的和系統(tǒng)的 類加載器加載的類,永不被回收。并且,通過其它類加載器加載的類,只有在加載器自己被回收后才可被回收。
  在1.1版JDK里使用單態(tài)類的讀者,假如不了解這一版爪哇語言的特點(diǎn),很有可能會(huì)碰到類消失掉的奇異問題。 為了使你的單態(tài)類能在所有版本的爪哇環(huán)境里使用,作者非凡提供一個(gè)"看管"類程序,它能保證你的單態(tài)類, 甚至其它任何對(duì)象,一旦交給"看管"對(duì)象,即不會(huì)莫名其妙地被垃圾回收器回收,直到你把它從"看管" 那里把它釋放出來。
   爪哇語言單態(tài)創(chuàng)立性模式介紹(下)(圖三)
  圖6. "看管"類的一個(gè)例子 
  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. 看管類的一個(gè)實(shí)現(xiàn)。
  看管類應(yīng)當(dāng)自我實(shí)例化,而且在每個(gè)系統(tǒng)里只需一個(gè)實(shí)例。這就意味著看管類本身就應(yīng)當(dāng)是單態(tài)類。當(dāng)然,類 消失的事情絕不可以發(fā)生在它自己身上。作者提供的例子剛好滿足所有的要求。
  一個(gè)實(shí)用的例子
  這里作者給出一個(gè)讀取屬性(properties)文件的單態(tài)類,作為單態(tài)類的一個(gè)實(shí)用的例子。 屬性文件如同老式的視窗編程時(shí)的.ini文件,屬于系統(tǒng)的“資源“,而讀取屬性文件即為資源治理, 顯然應(yīng)當(dāng)由一個(gè)單態(tài)類負(fù)責(zé)。
   爪哇語言單態(tài)創(chuàng)立性模式介紹(下)(圖四)
  圖7. 這個(gè)例子的UML 
  顯然,在大多數(shù)的系統(tǒng)中都會(huì)涉及屬性文件的讀取問題,因而這個(gè)例子非常有實(shí)用價(jià)值。 在這個(gè)例子里,作者假定需要讀取的屬性文件就在當(dāng)前目錄中,且名為singleton.properties。 在這個(gè)文件中有如下的一些屬性項(xiàng):
  node1.item1=How
  node1.item2=are
  node2.item1=you
  node2.item2=doing
  node3.item1=?
  代碼清單7. 屬性文件內(nèi)容
  本例子的源代碼如下:
  package com.javapatterns.singleton.demos;
  import java.util.Properties;
  import java.io.FileInputStream;
  import java.io.File;
  public class ConfigManager
  {
   /**
   * 私有的構(gòu)造子, 用以保證實(shí)例化的唯一性
   */
   private ConfigManager()
   {
  m_file = new File(PFILE);
  m_lastModifiedTime = m_file.lastModified();
  if(m_lastModifiedTime == 0)
  {
   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類的單一實(shí)例
   */
   synchronized public static ConfigManager getInstance()
   {
  return m_instance;
   }
   /**
   * 讀取一特定的屬性項(xiàng)
   *
   * @param name 屬性項(xiàng)的項(xiàng)名
   * @param defaultVal 屬性項(xiàng)的缺省值
   * @return 屬性項(xiàng)的值(如此項(xiàng)存在), 缺省值(如此項(xiàng)不存在)
   */
   final public Object getConfigItem(String name, Object defaultVal)
   {
  long newTime = m_file.lastModified();
  // 檢查屬性文件是否被其它程序(多數(shù)情況是程序員手動(dòng))修改過。
  // 假如是,重新讀取此文件。
  if(newTime == 0)
  {
   // 屬性文件不存在
   if(m_lastModifiedTime == 0)
   {
    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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 衡阳县| 格尔木市| 高密市| 东山县| 南岸区| 香河县| 同德县| 伊通| 沙洋县| 南皮县| 鄂尔多斯市| 黄平县| 郴州市| 柘城县| 上犹县| 梨树县| 双江| 梅州市| 四子王旗| 永修县| 景泰县| 阜南县| 呼和浩特市| 广汉市| 华亭县| 高淳县| 永登县| 广昌县| 东平县| 乌兰县| 滕州市| 濮阳县| 休宁县| 旺苍县| 丰台区| 汉川市| 仁化县| 山丹县| 中山市| 涟水县| 德化县|