熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

爪哇語言抽象工廠創立性模式介紹

2013-11-23 19:41:54  來源: Java高級技術 

  工廠模式有簡單工廠模式工廠方法模式和抽象工廠模式幾種形態其中簡單工廠模式和工廠方法模式已經在前面作過介紹在這裡我們來介紹抽象工廠模式
  抽象工廠模式是所有形態的工廠模式中最為抽象和最具廣泛性的一種形態
  抽象工廠模式的定義
  抽象工廠模式是工廠方法模式的進一步擴廣化和抽象化我們給出抽象工廠模式的類圖定義如下
   
  圖 抽象工廠模式的類圖定義 
  從上圖可以看出簡單工廠模式涉及到以下的角色
  抽象工廠(AbstractFactory)類或接口
  擔任這個角色的是工廠方法模式的核心它是與應用程序無關的任何在模式中創立對象的工廠類必須實現這個接口或繼承這個類
  實工廠類 (Conrete Factory)
  擔任這個角色的是與應用程序緊密相關的直接在應用程序調用下創立產品實例的那樣一些類
  抽象產品 (Abstract Product)
  擔任這個角色的類是工廠方法模式所創立的對象的父類或它們共同擁有的接口
  實產品 (Concrete Product)
  擔任這個角色的類是工廠方法模式所創立的任何對象所屬的類
  怎麼這個類圖和工廠方法模式的類圖看起來是一樣的?
  是的圖是一樣的但是含義有很大的不同必須指出在抽象工廠模式中抽象產品 (AbstractProduct) 可能是一個或多個從而構成一個或多個產品族(Product Family) 在只有一個產品族的情況下抽象工廠模式實際上退化到工廠方法模式在上面的類圖中只給出了一個產品族相當於位圖中的一個點而完整的位圖應當是三維的如下圖
   
  圖 抽象工廠模式的位圖 
  從位圖可以清楚地看到與紙面垂直的數軸即第三維軸是代表產品族的數軸上面的位圖中展示的是有兩個產品族族A和族B的情形
  在只有一個產品族時第三維就坍縮掉位圖也就只剩下兩維這時抽象工廠模式就退化得與工廠方法模式一模一樣
  在什麼情形下應當使用抽象工廠模式
  在以下情況下應當考慮使用抽象工廠模式
  首先一個系統應當不依賴於產品類實例被創立組成和表示的細節這對於所有形態的工廠模式都是重要的
  其次這個系統的產品有多於一個的產品族
  第三同屬於同一個產品族的產品是設計成在一起使用的這一約束必須得在系統的設計中體現出來
  最後不同的產品以一系列的接口的面貌出現從而使系統不依賴於接口實現的細節
  其中第二丶第三個條件是我們選用抽象工廠模式而非其它形態的工廠模式的關鍵性條件
  抽象工廠模式在小花果園系統中的實現
  現在我們在佛羅裡達的渡假小屋修整好啦接下來一項重要而光榮的工作就是開發小屋後面的小花園這意味著我們有兩處小花園需要照料一處在北方地區另一處在亞熱帶地區抽象工廠模式正好適用於我們的情況
   
  圖 抽象工廠模式應用於小花果園系統中三種不同的背景顏色可以區分工廠類蔬菜類(第一產品族)和水果類的類圖(第二產品族)
  兩處花園就相當於兩個產品族顯然給北方花園的植物是要種植在一起的給南方花園的植物是要另種植在一起的這種分別應當體現在系統的設計上面這就滿足了應當使用抽象工廠模式的第二和第三個條件
  package comjavapatternsabstractfactory;
  public interface Gardener {}
  代碼清單 接口 Gardener
  package comjavapatternsabstractfactory;
  public class NorthenGardener implements Gardener
  {
   public VeggieIF createVeggie(String name) { return new NorthernVeggie(name); }
   public FruitIF createFruit(String name) { return new NorthernFruit(name); }
  }
  代碼清單 實工廠類 NorthenGardener
  package comjavapatternsabstractfactory;
  public class TropicalGardener implements Gardener
  {
   public VeggieIF createVeggie(String name) { return new TropicalVeggie(name); }
  public FruitIF createFruit(String name) { return new TopicalFruit(name); }
  }
  代碼清單 實工廠類 TropicalGardener
  package comjavapatternsabstractfactory;
  public interface VeggieIF {}
  代碼清單 接口 VeggieIF
  package comjavapatternsabstractfactory;
  public class NorthernVeggie implements VeggieIF
  {
  public NorthernVeggie(String name) { thisname = name; }
  public String getName(){ return name; }
  public void setName(String name){ thisname = name; }
  private String name;
  }
  代碼清單 實產品類 NorthernVeggie實產品類 NorthernFruit 與此極為類似故略去
  package comjavapatternsabstractfactory;
  public class TropicalVeggie implements VeggieIF
  {
  public TropicalVeggie(String name) { thisname = name;}
  public String getName(){ return name; }
  public void setName(String name){ thisname = name; }
  private String name;
  }
  代碼清單 實產品類 TropicalVeggie實產品類 TropicalFruit 與此極為類似故略去
  筆者對植物的了解有限為免遺笑大方在上面的系統裡采用了簡化處理沒有給出高緯度和低緯度的水果類或蔬菜類的具體名稱
  抽象工廠模式的另一個例子
  這個例子講的是微型計算機的生產產品族有兩個PC(IBM系列)和Mac(MacIntosh系列)顯然我們應該使用抽象工廠模式而不是工廠方法模式因為後者適合於處理只有一個產品族的情形
   
  圖 抽象工廠模式應用於微型計算機生產系統中兩種不同的背景顏色可以區分兩類產品族及其對應的實工廠類 
  關於模式的實現
  在抽象實現工廠模式時有下面一些值得注意的技巧
  第一丶實工廠類可以設計成單態類很顯然在小花果園系統中我們只需要 NorthenGardener 和TropicalGardener 的一個實例就可以了關於單態類的知識請見<爪哇語言單態類創立性模式>
  第二丶在實現抽象工廠模式時產品類往往分屬多於一個的產品族而針對每一族都需要一個實工廠類在很多情況下幾個實工廠類都彼此相象只有些微的差別
  這時筆者建議使用原始模型(Prototype)模式這一模式會在以後介紹屆時作者會進一步闡述這一點
  第三丶設計更加靈活的實工廠以微型計算機生產系統為例PCProducer 是一個實工廠類它的不靈活之處在於每一種產品都有一個工廠方法CPU 有createCPU()RAM 有createRAM()等等如果一個已有的系統需要擴充比如增加硬盤這一新產品我們就需要增加一系列的接口 (createHD())丶類(HD PCHD MacHD)和方法這似乎不很理想
  一個解決的辦法是把createCPU()createRAM() createHD()這幾個方法合並為一個createPart(String type)方法這個合並後的方法返還一個Part接口所有的產品都要實現這一接口而CPURAM和HD接口則不再需要了每一個實產品都需要有一個屬性表明它們的種類是CPURAM和HD
  這樣做的結果是數據類型的豐富結構被扁平化了客戶端拿到的永遠是一個Part接口這對客戶端而言不很安全
  第四丶抽象工廠類可以配備靜態方法以返還實工廠設計的方法有兩種
  一種是以一個靜態方法按照參量的值返回所對應的實工廠靜態方法的數據類型是抽象方法類
  另一種是以每一個實工廠類都配備一個靜態方法其數據類型是該實工廠類
  問答題
  第如上面的討論抽象工廠類可以配備一個靜態方法按照參量的值返回所對應的實工廠請把微型計算機生產系統的抽象工廠類按照這一方案改造給出UML類圖和源代碼
  第如上面的討論抽象工廠類可以配備一系列靜態方法對應一系列的實工廠請把微型計算機生產系統的抽象工廠類按照這一方案改造給出UML類圖和源代碼
  第如上面的討論實工廠類可以設計成單態類請在第題的基礎上把微型計算機生產系統的實工廠類按照這一方案改造給出UML類圖和源代碼
  問答題答案
  第微型計算機生產系統的抽象工廠原本是接口現在需要改造成抽象類
   
  圖 三種不同的背景顏色可以區分抽象工廠類兩類產品族及其對應的實工廠類ComputerProducer 類圖中類名為斜體表明該類是抽象的而getProducer()的下劃線表明該方法是靜態的 
  package comjavapatternsabstractfactoryexercise;
  public class ComputerProducer
  {
   public static ComputerProducer getProducer(String which)
   {
  if (whichequalsIgnoreCase(PC))
  {
   return new PCProducer();
  }
  else (whichequalsIgnoreCase(Mac))
  {
  return new MacProducer();
  }
   }
  }
  代碼清單 抽象類 ComputerProducer 的方法 getProducer(String which)
  第
  第本題答案是在第題基礎之上的
   From:http://tw.wingwit.com/Article/program/Java/gj/201311/27318.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.