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

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

實現Java抽象工廠模式

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


  了解模式需要研究客戶端程序(使用模式者)和模式的內部結構,并且理解兩者之間的通信接口、模式本身因功能增加造成的變動(易碎性),以及客戶端程序利用新功能的難易程度。本文針對這些問題提出了一個具體的抽象工廠模式實現方案。
  模式結構介紹
  這個模式由一個工廠類層次和N個產品類層次組成。從每一個產品類層次中取出一個產品類形成產品類族,這個類族的實例為產品族。產品族中的產品之間有一種依靠關系。一個具體的工廠類負責創建產品族中的各個產品。
  從圖1可以看出,通信接口由一個抽象工廠接口和兩個抽象產品組成。模式部分顯示了兩個產品類 PRodUCtA 和ProductB、兩個產品類族ProductA1、ProductB1和ProductA2、ProductB2,以及兩個產品類族對應的兩個工廠ConcreteFactory1、ConcreteFactory2。
   實現Java抽象工廠模式(圖一)
  圖1 標準抽象工廠模式
  從模式定義中知道這個模式的意圖內容為:
  提供一個創建一系列相關或相互依靠對象的接口,而無需指定它們具體的類。工廠類層次的通信接口只有抽象工廠和創建產品族的各個工廠方法,這些工廠方法不帶任何參數,并且返回具有抽象產品類型的具體產品實例。這些使得客戶端可以不依靠具體產品的類,從而體現了模式的意圖。意圖中的“而無需指定它們具體的類”可以理解為客戶端在使用和創建具體產品時不給出具體產品的任何暗示。
  變動
  我們分析模式的變動時必須先固化模式和客戶端間的通信接口,即通信接口是固定不變的。分析變動就是分析模式的易碎性(模式實現適應變動的能力)。對抽象工廠模式可以考慮兩個變動:
  1. 加一個產品類族;
  2. 加一個產品類。
  變動一的易碎性較小,我們只需在每個產品類層次中增加這個產品族中產品類作為抽象產品類的子類,同時增加一個工廠子類來創建這個產品類族的產品族足以。
  變動二要求在模式中增加一個產品類,意味著增加一個產品類層次。由于通信接口中的工廠方法固定了客戶能創建的產品的類型數目,所以增加一個產品類意味著修改與客戶端的通信接口,進一步意味著舊的客戶端要使用新的模式實現就要重新編碼,整個工廠類層次都需要改動。綜合上述,這個變動的易碎性很大。
  設計
  程序架構
  一個程序可以從三個維度進行架構,這三個維度是層、級和服務。層代表了不同的抽象程度,比如操作系統的分層;級代表不同的角色和職責,比如Client/Server的兩級模型;服務代表了具有通用功能的支持模塊。
  實現一個模式從級這個維度來講可以簡單地分成兩級,即客戶端和模式端。從服務維度講模式可以利用某些服務,如事務、名字和目錄服務、安全等服務器提供商開發的設施服務。模式本身也可以實現成供客戶端訪問的服務,從而形成應用服務,典型的有EJB組件。應用程序的開發從層上考慮的比較少。圖2體現了實現抽象工廠模式的程序架構。
   實現Java抽象工廠模式(圖二)
  圖2 程序架構
  JNDI
  JNDI是java Naming and Directory Interface的簡寫,即Java命名和目錄服務接口。這個接口是名字和目錄服務通用編程的API。
  命名服務是一個系統基礎設施,給對象綁定一個名字,并能通過名字找到對象的機制。這個名字一般是面向使用者的。類似的服務實現有因特網域名系統(實現通過域名www. attern.com找到ip地址的手段)、文件系統(實現通過文件名找到文件的手段)等。
  目錄服務是名字服務的擴展,除了提供名字綁定之外,還答應對象擁有屬性。目錄服務中的對象為目錄對象。圖3和圖4分別表示了名字服務和目錄服務的概念定義。
   實現Java抽象工廠模式(圖三)
  圖3 名字服務的概念
   實現Java抽象工廠模式(圖四)
  圖4 目錄服務的概念
  一個名字系統由相互聯系的一系列上下文組成,上下文是名字與對象的綁定集合,相互聯系的一組上下文能形成一個層次結構。一個名字系統中所有的名字組成了這個系統的命名空間,而且命名空間有它自己的命名規范。一個目錄庫由一系列目錄對象組成,每個目錄對象可以有若干個屬性相連。
  1.JNDI架構如圖5,其中JNDI SPI為服務提供者接口,LDAP、DNS、NIS等為服務提供者,JNDI API為客戶程序使用服務的編程接口。
   實現Java抽象工廠模式(圖五)
  圖5 JNDI架構
  2.JNDI Java包,JDK1.3和后續版本已經包含了JNDI,另外還有幾個服務提供者,如LDAP、COS和RMI。其他的服務提供者可以從http://java.sun.com/products/jndi/serviceproviders.Html下載。JNDI分為五個包javax.naming 、javax.naming.directory 、javax.naming.event、 javax.naming.ldap 和javax.naming.spi ,一般情況下只需要前三個包。名字和目錄操作都是針對一個上下文來說的,但是沒有絕對根的上下文,所以就用一個初始上下文 InitialContext作為名字和目錄操作的起點,一旦有了這個上下文,就可以用它來查找其它上下文和對象。下面是進行名字操作和目錄操作初始上下文類的關系:
   實現Java抽象工廠模式(圖六)
  3.使用JNDI,在模式的實現中,我們可以用名字服務來實現子類的配置,也就是說在名字服務中指定子類的名字,由模式讀取這個子類配置,并創建一個子類實例返回給客戶端,客戶端用抽象父類來返回子類實例。通過這種機制實現“針對接口編程,而不是實現”的重用的面向對象設計的原則。
  Singlton模式的實現可以利用JNDI名字服務來實現。在名字服務中存放Singlton模式中的惟一實例,使用者要使用這個實例可以使用JNDI編程接口查詢這個對象。我們的工廠類對象的產生就可以采用這個方法。
  類圖設計
  目前沒有較好的辦法解決增加產品類帶來的舊客戶程序不能透明地使用新產品類的方案。假如能忍受這一點,這個變動的其它影響還是可以解決的。圖6為一個基于Class第一類對象的Java抽象工廠的模式變體結構圖。由此可以看出,抽象工廠不僅是接口,還是具體完成創建工作的類。它只有一個工廠方法,以抽象產品的類名為參數,以Java類庫的最頂層類Object為返回值??蛻舳税淹ㄐ沤涌诔橄螽a品類名傳給這個工廠方法,接著通過一個強制類型轉換而得到抽象產品對象。命名服務實現產品類族中每個產品類名到具體產品類名的映射,通過這樣一系列的映射定義了每一個具體工廠類要創建的產品類族。
   實現Java抽象工廠模式(圖七)
  圖6 抽象工廠模式變體類結構圖
  圖6中還顯示了編寫單元測試用例的類UnitTest和實用類SerObj。
  實現工廠通信接口的設計
  1.客戶端代碼如下:
  Factory factory = Factory. getInstance 
  ( "ldap://localhost:389/ dc = pattern, dc = com" ) ;
  AbstractProductA productA = factory. CreateProduct
  ( AbstractProductA的完全類名 );
  名字服務包含Factory的名字到工廠類對象的綁定。整個機制如圖7。
   實現Java抽象工廠模式(圖八)
  圖7 工廠類的Singleton設計
  2.單元測試代碼如下:
   實現Java抽象工廠模式(圖九)
  3.實現工廠Singlton模式的代碼如下:
   實現Java抽象工廠模式(圖十)
   實現Java抽象工廠模式(圖十)
  4.具體的工廠方法代碼如下:
  
  public class Factory implements java.io.Serializable {
   ...
   /**
  接受抽象產品類的完全類名,查詢目錄服務得到具體產品類的完全類名,采用JAVA的CLASS為第一類對象的機制創建相應類的對象。
  */
   public Object createProduct(String vstrClassName ){
   Context ctx = null;
   String strEntryName;
   String strEntryClassName;
   Object oResult = null;
   try{
  ctx = getInitialContext ( ) ;
  strEntryName = "cn=" + vstrClassName;
  strEntryClassName = ( String )ctx.lookup ( strEntryName ) ;
  try {
  Class clTem;
  clTem = Class.forName ( strEntryClassName ) ;
  oResult = clTem.newInstance ( ) ;
  }
  catch ( Exception ex ) {
  logger.error ( ex.toString ( ) );
  }
   }
   catch ( NamingException e ) { }
   finally{
  try{
  ctx.close ( ) ;
  }
  catch ( Exception e1 ) { }
  }
  return oResult;
   }
   ...
   }
  實現產品通信接口的設計
  抽象工廠模式的本意要求我們創建具體產品對象時,客戶端不能暗示任何具體產品對象類型的信息。但是通過分析模式的通信接口可知,客戶端可以告訴工廠類這些具體產品的父類。關于模式提到創建一些互相依靠的對象的本意,我們可以在目錄服務的目錄庫中實現。圖8、圖9分別定義了這樣的產品族關系。
   實現Java抽象工廠模式(圖十二)
  圖8 目錄服務產品族1的配置
  實現Java抽象工廠模式(圖十三)
  圖9 目錄服務產品族2的配置
  1.圖8表示在工廠類的工廠方法要求創建產品族1時,可以在目錄服務中指定抽象產品的完全類名綁定到產品族1的相應類名上。
  
  (1)單元測試代碼如下:
  
  public class UnitTest extends TestCase{
   ...
   public void testProduct1 ( ) {

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲bt欧美bt日本bt| 欧美自拍视频在线观看| 国产精品激情av电影在线观看| 亚洲片国产一区一级在线观看| 欧美日韩美女视频| 琪琪第一精品导航| 亚洲欧美中文日韩在线v日本| 国产精品揄拍500视频| 久久亚洲国产精品成人av秋霞| 最近日韩中文字幕中文| 国产精欧美一区二区三区| 午夜精品国产精品大乳美女| 日韩免费观看在线观看| 亚洲精品久久视频| 午夜精品福利在线观看| 亚洲一区二区久久久久久久| 亲爱的老师9免费观看全集电视剧| 国产一区二区三区在线看| 久久香蕉频线观| 国产精品福利在线观看| 欧美精品aaa| 色综合久久久久久中文网| 美女扒开尿口让男人操亚洲视频网站| 色悠久久久久综合先锋影音下载| 日韩视频免费在线| 欧美亚洲视频在线看网址| 人妖精品videosex性欧美| 亚洲久久久久久久久久| 欧美电影免费看| 精品亚洲国产成av人片传媒| 久久香蕉精品香蕉| 欧美激情亚洲一区| 国产精品久久久久久久9999| 亚洲精品美女在线观看| 中日韩美女免费视频网址在线观看| 欧美一级视频免费在线观看| 欧美黑人巨大xxx极品| 欧美大片在线看| 久久久久999| 欧洲美女免费图片一区| 日韩在线视频导航| 亚洲免费一级电影| 亚洲欧美日韩网| 久久久久久久电影一区| 国产精品吊钟奶在线| 91久久国产综合久久91精品网站| 按摩亚洲人久久| 精品久久国产精品| 91精品免费视频| 亚洲91精品在线观看| 亚洲视频综合网| 日韩h在线观看| 97成人超碰免| 午夜精品一区二区三区在线| 另类天堂视频在线观看| 欧美专区福利在线| 91社区国产高清| 亚洲女人天堂成人av在线| 国产热re99久久6国产精品| 欧美日韩一区二区免费视频| 日韩小视频在线观看| 久久久视频精品| 久久精品一本久久99精品| 国产成人精品日本亚洲专区61| 日韩欧美亚洲范冰冰与中字| 国产在线观看一区二区三区| 亚洲成人黄色网址| 69久久夜色精品国产69乱青草| 国产成人av网址| 欧美限制级电影在线观看| 91中文精品字幕在线视频| 国产欧美韩国高清| 欧美激情性做爰免费视频| 亚洲一区中文字幕| 日本亚洲欧洲色α| 久久久人成影片一区二区三区观看| 韩国三级日本三级少妇99| 尤物yw午夜国产精品视频明星| 国产免费一区二区三区在线能观看| 欧美伦理91i| 欧美性xxxxxxx| 亚洲精品国产福利| 91中文在线视频| 国产精品爽爽爽爽爽爽在线观看| 国模私拍一区二区三区| 亚洲精品视频二区| 久久久久99精品久久久久| 午夜精品久久久久久久99热| 成人精品在线观看| 亚洲xxxxx电影| 国产69精品久久久久9999| 亚洲在线免费看| 91综合免费在线| 亚洲香蕉成视频在线观看| 色妞欧美日韩在线| 久久久久久久久电影| 日韩精品免费在线视频| 亚洲自拍偷拍色片视频| 亚洲精品久久久久久久久久久久| 国产精品人成电影在线观看| 自拍视频国产精品| 国产丝袜一区二区| 日韩精品中文在线观看| 国产精品久久久久9999| 亚洲综合日韩中文字幕v在线| 成人激情综合网| 色综合天天综合网国产成人网| 91在线视频免费| 国产成+人+综合+亚洲欧洲| 一区二区三区 在线观看视| 亚洲护士老师的毛茸茸最新章节| 91国偷自产一区二区三区的观看方式| 91国语精品自产拍在线观看性色| 亚洲精品短视频| 97色在线视频观看| 日韩精品亚洲元码| 中文字幕一精品亚洲无线一区| 久久久国产精彩视频美女艺术照福利| 另类天堂视频在线观看| 欧美成aaa人片免费看| 亚洲免费av片| 2019最新中文字幕| 国产精品国产三级国产专播精品人| 亚洲bt天天射| 在线丨暗呦小u女国产精品| 中文字幕日韩在线播放| 欧美国产乱视频| 91精品在线观| 国产日韩综合一区二区性色av| 欧美一级大胆视频| 欧美午夜激情在线| 国产成人avxxxxx在线看| 亚洲综合在线播放| 中文国产亚洲喷潮| 日韩电影视频免费| 日韩av中文在线| 国产精品私拍pans大尺度在线| 97色在线观看| 久久久久久久国产精品| 亚洲成人在线网| 欧美激情视频三区| 国产欧美精品va在线观看| 97视频在线观看播放| www.久久撸.com| 疯狂欧美牲乱大交777| 97国产真实伦对白精彩视频8| 日韩av不卡电影| 国产精品久久久久久久久久东京| 久久久久久国产精品美女| 国产精品第1页| 国产精品国产福利国产秒拍| 色综合导航网站| 一区二区三区精品99久久| 91精品国产91久久久久久吃药| 亚洲va久久久噜噜噜久久天堂| 欧美日韩国产在线| 亚洲第一网站男人都懂| 久久精品99无色码中文字幕| 成人国产精品色哟哟| 一区二区三区回区在观看免费视频| 亚洲欧美激情一区| 国产大片精品免费永久看nba| 精品国产一区二区三区久久久狼| 欧美日韩精品在线视频|