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

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

爪哇語言工廠方法創立性模式介紹(上)

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

  正如同筆者在<簡單工廠模式>一節里介紹的,工廠模式有簡單工廠模式,工廠方法模式和抽象工廠模式幾種形態。簡單工廠模式已經在前面作過介紹。在簡單工廠模式中,一個工廠類處于對產品類實例化調用的中心位置上,它決定那一個產品類應當被實例化, 如同一個交通警察站在來往的車輛流中,決定放行那一個方向的車輛向那一個方向流動一樣。
  而本節要討論的工廠方法模式是簡單工廠模式的進一步抽象化和推廣。它比簡單工廠模式聰明的地方在于, 它不再作為一個具體的交通警察的面貌出現,而是以交通警察局的面貌出現。它把具體的車輛交通交給下面去治理。換言之,工廠方法模式里不再只由一個工廠類決定那一個產品類應當被實例化,這個決定被交給子類去作。處于工廠方法模式的中心位置上的類甚至都不去接觸那一個產品類應當被實例化這種細節。這種進一步抽象化的結果,是這種新的模式可以用來處理更加復雜的情形。
  為什么需要工廠方法模式
  現在,讓我們繼續考察我們的小花果園。在<簡單工廠模式>一節里,我們在后花園里引進了水果類植物, 構造了簡單工廠模式來處理, 使用一個FruitGardener類來負責創立水果類的實例。見下圖。
   爪哇語言工廠方法創立性模式介紹(上)(圖一)
  圖1. 簡單工廠模式。FruitGardener把握所有水果類的生殺大權。 
  在這一節里,我們預備再次引進蔬菜類植物,比如
  西紅柿 (Tomato)
  土豆 (Potato)
  西芥蘭花 (Broccoli)
  蔬菜與花和水果當然有共同點,可又有不同之處。蔬菜需要噴灑(dust)殺蟲劑(pesticide)除蟲, 不同的蔬菜需要噴灑不同的殺蟲劑,等等。怎么辦呢?
  那么,再借用一下簡單工廠模式不就行了? 再設計一個專管蔬菜類植物的工廠類,比如
   爪哇語言工廠方法創立性模式介紹(上)(圖二)
  圖2. 簡單工廠模式。VeggieGardener把握所有蔬菜類的生殺大權 
  這樣做一個明顯的不足點就是不夠一般化和抽象化。在FruitGardener和VeggieGardener類之間明顯存在很多共同點, 這些共同點應當抽出來一般化和框架化。這樣一來,假如后花園的主人決定再在園子里引進些樹木類植物時, 我們有框架化的處理方法。本節所要引入的工廠方法模式就符合這樣的要求。
  簡單工廠模式的回顧
  有必要首先回顧一下簡單工廠模式的定義,以便于比較。
   爪哇語言工廠方法創立性模式介紹(上)(圖三)
  圖3. 簡單工廠模式的類圖定義 
  從上圖可以看出,簡單工廠模式涉及到以下的角色
  工廠類 (Creator)
  擔任這個角色的是工廠方法模式的核心,是與應用程序緊密相關的,直接在應用程序調用下,創立產品實例的那個類。工廠類只有一個,而且是實的。見下面的位圖
   爪哇語言工廠方法創立性模式介紹(上)(圖四)
  產品 (PRodUCt)
  擔任這個角色的類是工廠方法模式所創立的對象的父類,或它們共同擁有的接口。
  實產品 (Concrete Product)
  擔任這個角色的類是工廠方法模式所創立的任何對象所屬的類。
  實產品類可以是分布在一維數軸上的分立點 1,2,3,...中的任何一個,見下面的位圖
   爪哇語言工廠方法創立性模式介紹(上)(圖五)
  工廠方法模式的定義
  我們給出工廠方法模式的類圖定義如下。
   爪哇語言工廠方法創立性模式介紹(上)(圖六)
  圖4. 工廠方法模式的類圖定義 
  從上圖可以看出,工廠方法模式涉及到以下的角色
  抽象工廠接口(Creator)
  擔任這個角色的是工廠方法模式的核心,它是與應用程序無關的。任何在模式中創立對象的工廠類必須實現這個接口。
  實工廠類 (Conrete Creator)
  擔任這個角色的是與應用程序緊密相關的,直接在應用程序調用下,創立產品實例的那樣一些類。
  實工廠類可以是分布在一維數軸上的分立點 1,2,3,...中的任何一個,見下面的位圖
   爪哇語言工廠方法創立性模式介紹(上)(圖七)
  產品 (Product)
  擔任這個角色的類是工廠方法模式所創立的對象的父類,或它們共同擁有的接口。
  實產品 (Concrete Product)
  擔任這個角色的類是工廠方法模式所創立的任何對象所屬的類。
  實產品類可以是分布在二維平面上的分立點 (1,1), (1,2), (2,3),...中的任何一個,見下面的位圖
   爪哇語言工廠方法創立性模式介紹(上)(圖八)
  由實工廠1(橫數軸上第一點)創立的對象來自實產品類(1,1), (1,2), (1,3),...。由實工廠2(橫數軸上第二點)創立的對象來自實產品類(2,1), (2,2), (3,3),...。依此類推 
  工廠方法模式和簡單工廠模式在定義上的不同是很明顯的。工廠方法模式的核心是一個抽象工廠類,而不像簡單工廠模式, 把核心放在一個實類上。工廠方法模式可以答應很多實的工廠類從抽象工廠類繼續下來, 從而可以在實際上成為多個簡單工廠模式的綜合,從而推廣了簡單工廠模式。
  反過來講,簡單工廠模式是由工廠方法模式退化而來。設想假如我們非常確定一個系統只需要一個實的工廠類, 那么就不妨把抽象工廠類合并到實的工廠類中去。而這樣一來,我們就退化到簡單工廠模式了。
  與簡單工廠模式中的情形一樣的是,ConcreteCreator 的factory() 方法返還的數據類型是一個接口 PlantIF,而不是哪一個具體的產品類。這種設計使得工廠類創立哪一個產品類的實例細節完全封裝在工廠類內部。
  工廠方法模式又叫多形性工廠模式,顯然是因為實工廠類都有共同的接口,或者都有共同的抽象父類。
  工廠方法模式在小花果園系統中的實現
  好了,現在讓我們回到小花果園的系統里,看一看怎樣發揮工廠方法模式的威力,解決需要接連不斷向小花果園引進不同類別的植物所帶來的問題。
  首先,我們需要一個抽象工廠類,比如叫做 Gardener,作為兩個實工廠類 FruitGardener 及 VeggieGardener 的父類。 Gardener 的 factory() 方法可以是抽象的,留給子類去實現,也可以是實的,在父類實現一部分功能,再在子類實現剩余的功能。我們選擇將 factory() 做成抽象的,主要是因為我們的系統是一個示范系統,內容十分簡單,沒有要在父類實現的任何功能。
  爪哇語言工廠方法創立性模式介紹(上)(圖九)
  圖5. 工廠方法模式在小花果園系統中的實現 
  抽象工廠類 Gardener 是工廠方法模式的核心,但是它并不把握水果類或蔬菜類的生殺大權。相反地,這項權力被交給子類,即 VeggieGardener 及 FruitGardener。
  package com.javapatterns.factorymethod;
  abstract public class Gardener
  {
   public abstract PlantIF factory(String which) throws BadFruitException;
  }
  代碼清單1. 父類 Gardener。
  package com.javapatterns.factorymethod;
  
  public class VeggieGardener extends Gardener
  {
   public PlantIF factory(String which) throws BadPlantException
   {
  if (which.equalsIgnoreCase("tomato"))
  {
   return new Tomato();
  }
  else if (which.equalsIgnoreCase("potato"))
  {
   return new Potato();
  }
  else if (which.equalsIgnoreCase("broccoli"))
  {
   return new Broccoli();
  }
  else
  {
   throw new BadPlantException("Bad veggie request");
  }
   }
  
  }
  代碼清單2. 子類 VeggieGardener。
  
  package com.javapatterns.factorymethod;
  
  public class FruitGardener extends Gardener
  {
   public PlantIF factory(String which)
   {
  if (which.equalsIgnoreCase("apple"))
  {
   return new Apple();
  }
  else if (which.equalsIgnoreCase("strawberry"))
  {
   return new Strawberry();
  }
  else if (which.equalsIgnoreCase("grape"))
  {
   return new Grape();
  }
  else
  {
   throw new BadPlantException("Bad fruit request");
  }
   }
  }
  代碼清單3. 子類 FruitGardener。
  package com.javapatterns.factorymethod;
  
  public class Broccoli implements VeggieIF, PlantIF
  {
   public void grow()
   {
  log("Broccoli is growing...");
   }
  
   public void harvest()
   {
  log("Broccoli has been harvested.");
   }
   public void plant()
   {
  log("Broccoli has been planted.");
   }
   private static void log(String msg)
   {
  System.out.println(msg);
   }
   public void pesticideDust(){ }
  }
  代碼清單4. 蔬菜類 Broccoli。其它的蔬菜類與 Broccoli 相似,因此不再贅述。
  package com.javapatterns.factorymethod;
  public class Apple implements FruitIF, PlantIF
  {
   public void grow()
   {
  log("Apple is growing...");
   }
   public void harvest()
   {
  log("Apple has been harvested.");
   }
   public void plant()
   {
  log("Apple has been planted.");
   }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女视频网| 亚洲在线视频福利| 欧美精品videofree1080p| 日韩69视频在线观看| 欧美专区中文字幕| 亚洲va欧美va国产综合剧情| 日韩免费电影在线观看| 菠萝蜜影院一区二区免费| 中文字幕在线日韩| 北条麻妃99精品青青久久| 性欧美亚洲xxxx乳在线观看| 日韩成人av网| 日本精品一区二区三区在线播放视频| 98午夜经典影视| 懂色av影视一区二区三区| 精品高清一区二区三区| 成人精品一区二区三区电影免费| 91精品国产色综合| 日本精品久久久久久久| 91久久久久久久久| 色www亚洲国产张柏芝| 亚洲欧美日韩成人| 亚洲天堂免费观看| 成人欧美一区二区三区黑人孕妇| 亚洲第一页在线| 国产精品久久久久久久久| 日韩综合中文字幕| 欧美性xxxxx极品娇小| 日韩中文字幕精品| 91a在线视频| 日韩中文字幕国产精品| 亚洲天堂视频在线观看| 97在线观看视频| 国产精品网站入口| 国产视频丨精品|在线观看| 欧美日韩国产第一页| 91亚洲精品一区| 中文字幕精品国产| 国产精品免费久久久| 国产精品视频资源| 国产精品美腿一区在线看| 91最新国产视频| 精品日韩中文字幕| 国模视频一区二区三区| 亚洲最大成人在线| 欧美日韩综合视频| 日韩精品有码在线观看| 精品日韩视频在线观看| 色综合伊人色综合网站| 最新国产精品拍自在线播放| 日韩黄色av网站| 亚洲国产成人在线视频| 国产精品扒开腿做| 一区三区二区视频| 久久精品91久久久久久再现| www.日韩不卡电影av| 97在线免费视频| 亚洲国产欧美一区二区三区同亚洲| 欧美亚洲午夜视频在线观看| 亚洲最新av在线网站| 国产三级精品网站| 欧美午夜激情小视频| 亚洲人成毛片在线播放| 亚洲美女性视频| 97精品伊人久久久大香线蕉| 久久精品免费电影| 精品国产福利视频| 国产综合色香蕉精品| 国产欧美日韩丝袜精品一区| 国产精品777| 精品国内亚洲在观看18黄| 国产精品嫩草影院一区二区| 国产亚洲精品美女| 91亚洲国产成人久久精品网站| 久久视频国产精品免费视频在线| 色偷偷亚洲男人天堂| 在线亚洲国产精品网| 欧美性猛交xxxxx免费看| 成人av在线天堂| 亚洲国产精品悠悠久久琪琪| 亚洲天堂av图片| 国产精品久久久av| 欧美精品性视频| 欧美精品在线视频观看| 日本高清不卡的在线| 欧美精品激情在线观看| 欧美一区二区三区四区在线| 国产视频观看一区| 91九色国产社区在线观看| 97精品视频在线播放| 欧美福利视频在线| 精品久久久999| 欧美在线观看www| 日本高清视频精品| 久久精品人人做人人爽| 国产精品一香蕉国产线看观看| 国产一区二区黑人欧美xxxx| 欧美国产激情18| 成人免费视频97| 在线视频国产日韩| 久国内精品在线| 国产免费观看久久黄| 欧美精品情趣视频| 91国在线精品国内播放| 亚洲aaaaaa| 91视频国产高清| 高清日韩电视剧大全免费播放在线观看| 欧美日韩国产精品一区二区不卡中文| 亚洲美女精品成人在线视频| 亚洲在线www| 欧美精品久久久久久久久| 国产精品极品美女在线观看免费| 国内精品一区二区三区四区| 国产精品网站入口| 亚洲欧美国产精品va在线观看| 亚洲国内高清视频| 国产精品手机播放| 亚洲欧美激情在线视频| 亚洲国产精品999| 国产婷婷成人久久av免费高清| 亚洲第一综合天堂另类专| 91成人免费观看网站| 亚洲第一av网站| 欧美xxxx14xxxxx性爽| 久久久久久美女| 欧美精品生活片| 欧美精品久久一区二区| 欧美日韩爱爱视频| 亚洲视频在线看| 色七七影院综合| 亚洲最新av在线网站| 精品一区二区三区四区在线| 欧美性高跟鞋xxxxhd| 性欧美办公室18xxxxhd| 91精品国产综合久久香蕉的用户体验| 国产va免费精品高清在线观看| 日本免费在线精品| 国产91对白在线播放| 97高清免费视频| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲成人a**站| 一区二区欧美日韩视频| 色综合色综合久久综合频道88| 国产精品一区二区av影院萌芽| 国产精品视频不卡| 亚洲激情在线视频| 最近中文字幕日韩精品| 日韩有码片在线观看| www.久久久久久.com| 亚洲精品一区久久久久久| 欧美日韩精品在线播放| 97色在线观看| 91精品国产综合久久香蕉最新版| 欧美精品做受xxx性少妇| 日本a级片电影一区二区| 日本一区二区在线播放| 国产成人小视频在线观看| 久久午夜a级毛片| 亚洲人成亚洲人成在线观看| 亚洲永久免费观看| 久久这里只有精品视频首页| 国产精品视频免费在线观看| 亚洲电影在线看| 中文字幕在线成人|