亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

爪哇語言單態創立性模式介紹(下)

2019-11-18 12:16:33
字體:
來源:轉載
供稿:網友

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


  圖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. 登記式單態類。(注重為簡單起見,這里沒有考慮多線程訪問限制的問題,讀者可自行加入一個有雙重 檢查的訪問限制)
  它的子類
   爪哇語言單態創立性模式介紹(下)(圖二)
  圖5. 登記式單態類子類的一個例子。
  圖中的關系線表明,此類是由父類將自己實例化的?!?br />  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. 登記式單態類的子類。
  在GoF原始的例子中,并沒有getInstance()方法,這樣得到子類必須調用文類的getInstance(String name) 方法,并傳入子類的名字,很不方便。 作者在登記式單態類子類的例子里,加入了getInstance()方法,這樣做的好處是RegSingletonChild 可以通過這個方法,返還自已的實例,而這樣做的缺點是,由于數據類型不同,無法在RegSingleton提供 這樣一個方法。
  由于子類必須充許父類以構造子調用產生實例,因此它的構造子必須是公開的。這樣一來,就等于答應了 以這樣方式產生實例而不在父類的登記中。這是登記式單態類的一個缺點。
  GoF曾指出,由于父類的實例必須存在才可能有子類的實例,這在有些情況下是一個浪費。 這是登記式單態類的另一個缺點。
  爪哇語言里的垃圾回收
  爪哇語言里垃圾回收使得單態類的使用變得有點復雜。原因就在于JDK1.1版里加進去的類的自動清除。 這種類的垃圾回收會清除掉類本身,而不僅僅是對象!事實上JDK1.1甚至可以清除掉一些系統類!
  在JDK1.0.x版本里,類的自動清除尚未加入。
  在JDK1.2及以后的版本里,升陽公司又收緊了類的垃圾回收規則,它規定,所有通過局部的和系統的 類加載器加載的類,永不被回收。并且,通過其它類加載器加載的類,只有在加載器自己被回收后才可被回收。
  在1.1版JDK里使用單態類的讀者,假如不了解這一版爪哇語言的特點,很有可能會碰到類消失掉的奇異問題。 為了使你的單態類能在所有版本的爪哇環境里使用,作者非凡提供一個"看管"類程序,它能保證你的單態類, 甚至其它任何對象,一旦交給"看管"對象,即不會莫名其妙地被垃圾回收器回收,直到你把它從"看管" 那里把它釋放出來。
   爪哇語言單態創立性模式介紹(下)(圖三)
  圖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. 看管類的一個實現。
  看管類應當自我實例化,而且在每個系統里只需一個實例。這就意味著看管類本身就應當是單態類。當然,類 消失的事情絕不可以發生在它自己身上。作者提供的例子剛好滿足所有的要求。
  一個實用的例子
  這里作者給出一個讀取屬性(properties)文件的單態類,作為單態類的一個實用的例子。 屬性文件如同老式的視窗編程時的.ini文件,屬于系統的“資源“,而讀取屬性文件即為資源治理, 顯然應當由一個單態類負責。
   爪哇語言單態創立性模式介紹(下)(圖四)
  圖7. 這個例子的UML 
  顯然,在大多數的系統中都會涉及屬性文件的讀取問題,因而這個例子非常有實用價值。 在這個例子里,作者假定需要讀取的屬性文件就在當前目錄中,且名為singleton.properties。 在這個文件中有如下的一些屬性項:
  node1.item1=How
  node1.item2=are
  node2.item1=you
  node2.item2=doing
  node3.item1=?
  代碼清單7. 屬性文件內容
  本例子的源代碼如下:
  package com.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 == 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類的單一實例
   */
   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 == 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99久久99精品中文字幕| 亚洲最大激情中文字幕| 亚洲欧美激情在线视频| 亚洲精品国产精品国产自| 91精品久久久久久久久久| 亚洲人成网站色ww在线| 日韩免费观看网站| 热re99久久精品国产66热| 97视频免费在线观看| 午夜精品久久久久久久久久久久| 疯狂蹂躏欧美一区二区精品| 青青草99啪国产免费| 亚洲mm色国产网站| 欧美综合在线观看| 日韩在线观看网站| 久久久久久久激情视频| 97激碰免费视频| 国产视频精品va久久久久久| 91精品国产91久久久久久久久| 青青在线视频一区二区三区| 国产精品www网站| 国产精品一二区| 亚洲欧美精品中文字幕在线| 亚洲天堂av高清| 高清欧美性猛交| 精品国产一区二区三区四区在线观看| 国产精品永久免费观看| 欧美精品videossex性护士| 欧美国产日韩精品| 精品国产91久久久久久| 亚洲欧美日韩国产成人| 亚洲成人精品视频在线观看| 欧美精品制服第一页| 精品亚洲国产成av人片传媒| 欧美精品在线观看| 精品久久久久久国产91| 亚洲在线免费看| 国语自产精品视频在免费| 日韩经典一区二区三区| 欧美日韩在线免费观看| 欧美在线精品免播放器视频| 中文字幕亚洲一区二区三区| 神马国产精品影院av| 国产日产亚洲精品| 九九精品在线播放| 国产精品日韩av| 一区二区日韩精品| 97久久国产精品| 欧美日本在线视频中文字字幕| 97国产精品视频人人做人人爱| 国产欧美日韩免费| 久久久久久美女| 国内精品400部情侣激情| 91福利视频网| 国产一区二区三区视频| 国产亚洲精品久久久久久牛牛| 亚洲欧美中文另类| 亚洲成人免费在线视频| 欧美国产日韩一区二区在线观看| 久国内精品在线| 国产精品成人观看视频国产奇米| 日韩欧美第一页| 成人国产精品av| 亚洲韩国日本中文字幕| 中文字幕精品在线视频| 最新91在线视频| 欧美黄色片免费观看| 国产精品欧美日韩一区二区| 日韩欧美在线视频日韩欧美在线视频| 欧美成人国产va精品日本一级| 日韩在线观看免费网站| 91久久在线观看| 亚洲欧美日韩久久久久久| 精品自在线视频| 亚洲精品日韩丝袜精品| 国产精品成人品| 668精品在线视频| 国产狼人综合免费视频| 欧美人与性动交a欧美精品| 色噜噜国产精品视频一区二区| 中文字幕亚洲欧美日韩在线不卡| 色综合久综合久久综合久鬼88| 午夜精品蜜臀一区二区三区免费| 国产精品91在线| 日本欧美国产在线| 欧美风情在线观看| 色香阁99久久精品久久久| 亚洲国产天堂久久国产91| 成人网页在线免费观看| 成人亚洲综合色就1024| 欧美肥老妇视频| 久久免费精品视频| 97人人爽人人喊人人模波多| 国产一区二中文字幕在线看| 亚洲精品国产精品自产a区红杏吧| 国产精品黄页免费高清在线观看| 亚洲国产欧美一区二区三区久久| 亚洲自拍av在线| 精品久久久免费| 国产精品美女主播在线观看纯欲| 亚洲国产精品999| 亚洲国产美女精品久久久久∴| 一区二区欧美日韩视频| 日韩美女视频在线观看| 亚洲成人av中文字幕| 日韩在线欧美在线国产在线| 韩剧1988在线观看免费完整版| 国产91精品久久久久| 日韩av最新在线观看| 92国产精品久久久久首页| 一区二区三区国产在线观看| 欧美激情国产日韩精品一区18| 国产成人精品国内自产拍免费看| 欧美亚洲日本黄色| 97免费在线视频| 日韩精品中文字| 国产精品va在线| 精品亚洲夜色av98在线观看| 欧美老肥婆性猛交视频| 欧美精品video| 国产盗摄xxxx视频xxx69| 日韩欧美精品中文字幕| 欧美午夜性色大片在线观看| 久久国产色av| 欧美日韩国产中字| 最近2019中文免费高清视频观看www99| 国产精品91在线观看| 狠狠躁夜夜躁人人爽天天天天97| 亚洲视频在线观看| 色妞欧美日韩在线| 欧美日本啪啪无遮挡网站| 欧美日韩一区二区三区| 国产精品久久久久久久一区探花| 亚洲成年人在线| 午夜精品久久久久久久99黑人| 在线看福利67194| 精品呦交小u女在线| 国产精品视频1区| 国产精品青草久久久久福利99| 在线视频日韩精品| 久久久在线视频| 亚洲影院污污.| 久久久久久亚洲精品中文字幕| 精品毛片网大全| 久久影院资源站| 国产成人在线一区二区| 最近2019免费中文字幕视频三| 日韩在线观看免费av| 日韩国产激情在线| 最新69国产成人精品视频免费| 国产精品免费一区| 日韩在线视频免费观看高清中文| 久久精品国产欧美激情| 精品中文字幕视频| 亚洲精品永久免费精品| 欧美日韩亚洲一区二区三区| 久久精品中文字幕一区| 一区二区三区视频在线| 国产丝袜一区二区三区免费视频| 国产激情综合五月久久| 亚洲精品电影久久久| 97香蕉超级碰碰久久免费的优势| 欧美成人午夜剧场免费观看| 91久久中文字幕|