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

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

在Java中應用設計模式之Factory Method

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

  在設計模式中,Factory Method也是比較簡單的一個,但應用非常廣泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是最重要的模式之一。在很多地方我們都會看到xxxFactory這樣命名的類,那么,什么是Factory Method,為什么要用這個模式,如何用java語言來實現該模式,這就是本文想要帶給大家的內容。
  
  基本概念
  
  Factory Method是一種創建性模式,它定義了一個創建對象的接口,但是卻讓子類來決定具體實例化哪一個類。當一個類無法預料要創建哪種類的對象或是一個類需要由子類來指定創建的對象時我們就需要用到Factory Method 模式了。
  
  簡單說來,Factory Method可以根據不同的條件產生不同的實例,當然這些不同的實例通常是屬于相同的類型,具有共同的父類。Factory Method把創建這些實例的具體過程封裝起來了,簡化了客戶端的應用,也改善了程序的擴展性,使得將來可以做最小的改動就可以加入新的待創建的類。 通常我們將Factory Method作為一種標準的創建對象的方法,當發現需要更多的靈活性的時候,就開始考慮向其它創建型模式轉化。
  
  簡單分析
  
  圖1是Factory Method 模式的結構圖,這里提供了一些術語,讓我們可以進行更方便的描述:
  
在Java中應用設計模式之Factory Method

  
圖1: Factory Method 模式結構

  
  1.PRodUCt: 需要創建的產品的抽象類。
  
  2.ConcreteProduct: Product的子類,一系列具體的產品。
  
  3.Creator: 抽象創建器接口,聲明返回Product類型對象的Factory Method。
  
  4.ConcreteCreator: 具體的創建器,重寫Creator中的Factory Method,返回ConcreteProduct類型的實例。
  
  由此可以清楚的看出這樣的平行對應關系:
  
  Product <====> Creator ;
  ConreteProduct <====> ConreteCreator
  
  抽象產品對應抽象創建器,具體產品對應具體創建器。這樣做的好處是什么呢?為什么我們不直接用具體的產品和具體的創建器完成需求呢?實際上我們也可以這樣做。但通過Factory Method模式來完成,客戶(client)只需引用抽象的Product和Creater,對具體的ConcreteProduct和ConcreteCreator可以毫不關心,這樣做我們可以獲得額外的好處。
  
  首先客戶端可以統一從抽象創建器獲取產生的實例,Creator的作用將client和產品創建過程分離開來,客戶不用操心返回的是那一個具體的產品,也不用關心這些產品是如何創建的。
  
  同時,ConcreteProduct也被隱藏在Product后面,ConreteProduct繼續了Product的所有屬性,并實現了Product中定義的抽象方法,按照Java中的對象造型(cast)原則,通過ConcreteCreator產生的ConcreteProduct可以自動的上溯造型成Product。這樣一來,實質內容不同的ConcreteProduct就可以在形式上統一為Product,通過Creator提供給client來訪問。
  
  其次,當我們添加一個新的ConcreteCreator時,由于Creator所提供的接口不變,客戶端程序不會有絲毫的改動,不會帶來動一發而牽全身的災難, 這就是良好封裝性的體現。但假如直接用ConcreteProduct和ConcreteCreator兩個類是無論如何也做不到這點的。
  
  優良的面向對象設計鼓勵使用封裝(encapsulation)和委托(delegation),而Factory Method模式就是使用了封裝和委托的典型例子,這里封裝是通過抽象創建器Creator來體現的,而委托則是通過抽象創建器把創建對象的責任完全交給具體創建器ConcreteCreator來體現的。
  
  現在,請再回頭看看基本概念中的那段話,開始也許覺得生澀難懂,現在是不是已經明朗化了很多。
  
  下面讓我們看看在 Java 中如何實現Factory Method模式,進一步加深對它的熟悉。
  
  具體實施
  
  先說明一點,用Factory Method模式創建對象并不一定會讓我們的代碼更短,實事上往往更長,我們也使用了更多的類,真正的目的在于這樣可以靈活的,有彈性的創建不確定的對象。而且,代碼的可重用性提高了,客戶端的應用簡化了,客戶程序的代碼會大大減少,變的更具可讀性。
  
  標準實現: 這里我采用Bruce Eckel 用來描述OO思想的經典例子 Shape。這樣大家會比較熟悉一些。我完全按照圖1中所定義的結構寫了下面的一段演示代碼。這段代碼的作用是創建不同的Shape實例,每個實例完成兩個操作:draw和erase。具體的創建過程委托?ShapeFactory來完成。
  
  1.a 首先定義一個抽象類Shape,定義兩個抽象的方法。
  
  abstract class Shape
  {
  // 勾畫shape
  public abstract void draw();
  // 擦去 shape
  public abstract void erase();
  
  public String name;
  public Shape(String aName)
  {
  name = aName;
  }
  }
  
  1.b 定義 Shape的兩個子類: Circle, Square,實現Shape中定義的抽象方法
  
  // 圓形子類
  class Circle extends Shape
  {
  public void draw()
  {
  System.out.println("It will draw a circle.");
  }
  public void erase()
  {
  System.out.println("It will erase a circle.");
  }
  // 構造函數
  public Circle(String aName)
  {
  super(aName);
  }
  }
  
  // 方形子類
  class Square extends Shape
  {
  public void draw()
  {
  System.out.println("It will draw a square.");
  }
  public void erase() {
  System.out.println("It will erase a square.");
  }
  // 構造函數
  public Square(String aName)
  {
  super(aName);
  }
  }
  
  1.c 定義抽象的創建器,anOperation調用factoryMethod創建一個對象,并對該對象進行一系列操作。
  
  abstract class ShapeFactory
  {
  protected abstract Shape
  factoryMethod(String aName);
  // 在anOperation中定義Shape的一系列行為
  public void anOperation(String aName)
  {
  Shape s = factoryMethod(aName);
  System.out.println
  ("The current shape is: " + s.name);
  s.draw();
  s.erase();
  }
  }
  
  1.d 定義與circle和square相對應的兩個具體創建器CircleFactory,SquareFactory,實現父類的methodFactory方法
  
  // 定義返回 circle 實例的 CircleFactory
  class CircleFactory extends ShapeFactory
  {
  // 重載factoryMethod方法,返回Circle對象
  protected Shape factoryMethod(String aName)
  {
  return new Circle(aName + "
  (created by CircleFactory)");
  }
  }
  
  // 定義返回 Square
  實例的 SquareFactory
  class SquareFactory extends ShapeFactory
  {
  // 重載factoryMethod方法,返回Square對象
  protected Shape factoryMethod(String aName)
  {
  return new Square
  (aName + " (created by SquareFactory)");
  }
  }
  
  1.e 測試類:請注重這個客戶端程序多么簡潔,既沒有羅嗦的條件判定語句,也無需關心ConcreteProduct和ConcreteCreator的細節(因為這里我用anOperation封裝了Product里的兩個方法,所以連Product的影子也沒看見,當然把Product里方法的具體調用放到客戶程序中也是不錯的)。
  
  class Main
  {
  public static void main(String[] args)
  {
  ShapeFactory sf1 = new SquareFactory();
  ShapeFactory sf2 = new CircleFactory();
  sf1.anOperation("Shape one");
  sf2.anOperation("Shape two");
  }
  }
  
  運行結果如下:
  
  The current shape is: Shape one
  (created by SquareFactory)
  It will draw a square.
  It will erase a square.
  The current shape is: Shape two
  (created by CircleFactory)
  It will draw a circle.
  It will erase a circle.
  
  參數化的Factory Method: 這種方式依靠指定的參數作為標志來創建對應的實例,這是很常見的一種辦法。比如JFC中的BorderFactory就是個很不錯的例子。
  
  以下的這個例子是用字符串作為標記來進行判定的,假如參數的類型也不一樣,那就可以用到過載函數來解決這個問題,定義一系列參數和方法體不同的同名函數,這里java.util.Calendar.getInstance()又是個極好的例子。
  
  參數化的創建方式克服了Factory Method模式一個最顯著的缺陷,就是當具體產品比較多時,我們不得不也建立一系列與之對應的具體構造器。 但是在客戶端我們必須指定參數來決定要創建哪一個類。
  
  2.a 我們在第一種方法的基礎上進行修改,首先自定義一個的異常,這樣當傳入不正確的參數時可以得到更明顯的報錯信息。
  
  class NoThisShape extends Exception
  {
  public NoThisShape(String aName)
  {
  super(aName);
  }
  }
  
  2.b 去掉了ShapeFactory的兩個子類,改為由ShapeFactory直接負責實例的創建。 ShapeFactory自己變成一個具體的創建器,直接用參數化的方法實現factoryMethod返回多種對象。<

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线观看免费网站| 成人午夜激情免费视频| www欧美xxxx| 中文字幕亚洲欧美日韩2019| 91精品国产成人| 亚洲精品xxx| 久久人人爽人人| 韩国视频理论视频久久| 日韩精品免费观看| 国产精品一区二区久久精品| 日本一欧美一欧美一亚洲视频| 成人国产在线激情| 亚洲aⅴ男人的天堂在线观看| 久久九九全国免费精品观看| 日韩av色综合| 亚洲欧美综合区自拍另类| 精品久久久一区二区| 日本一区二区三区四区视频| 精品调教chinesegay| 57pao成人国产永久免费| 日本中文字幕不卡免费| 欧美日韩亚洲国产一区| 在线亚洲男人天堂| 久久网福利资源网站| 亚洲影院色在线观看免费| 美女久久久久久久久久久| 亚洲全黄一级网站| 午夜精品蜜臀一区二区三区免费| 国产精品91免费在线| 日本韩国在线不卡| 国产美女久久精品香蕉69| 大伊人狠狠躁夜夜躁av一区| 欧美激情一二三| 亚洲一区二区三区毛片| 国产精品成人va在线观看| 国产精品露脸自拍| 78色国产精品| 精品国偷自产在线视频| 久久韩剧网电视剧| 久久亚洲国产精品成人av秋霞| 国产午夜精品视频免费不卡69堂| 尤物yw午夜国产精品视频明星| 国产欧美精品久久久| 国产成人精品国内自产拍免费看| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲最大中文字幕| 性色av香蕉一区二区| 日韩精品亚洲精品| 久久精品久久久久| 国产欧美日韩高清| 国产91久久婷婷一区二区| 深夜福利一区二区| 亚洲在线免费看| 亚洲国产日韩精品在线| 亚洲成色777777在线观看影院| 亚洲一区二区少妇| 国产精品吹潮在线观看| 亚洲色图17p| 91久久综合亚洲鲁鲁五月天| 国产精品久久久久久久久久久新郎| 欧美久久精品一级黑人c片| 成人亚洲欧美一区二区三区| 亚洲电影在线看| 久久久久久网站| 精品国产欧美成人夜夜嗨| 亚洲午夜激情免费视频| 美女精品视频一区| 欧美老女人在线视频| 欧美视频在线观看免费网址| 精品国产一区二区三区四区在线观看| 国产精品视频区| 精品国产91久久久久久老师| 性欧美办公室18xxxxhd| 在线播放日韩精品| 亚洲人成在线播放| 欧美丝袜美女中出在线| 国产日韩在线免费| 91美女高潮出水| 国产成人一区二区在线| 97av在线影院| 91亚洲一区精品| 亚洲精品久久久久中文字幕二区| 亚洲最新av在线网站| 国产精品igao视频| 中文字幕在线成人| 日韩欧美第一页| 98午夜经典影视| 国产精品免费在线免费| 日韩一区二区三区xxxx| 另类色图亚洲色图| 国产精品男人的天堂| 日韩精品在线免费观看视频| 亚洲丁香婷深爱综合| 国产精品成人v| 久久久久亚洲精品| 一区二区三区精品99久久| 亚洲欧美精品中文字幕在线| 中文字幕成人在线| 国产精品久久久久久久久久免费| 亚洲性日韩精品一区二区| 97视频在线观看免费高清完整版在线观看| 日韩人在线观看| 国产成人精品综合久久久| 久久香蕉国产线看观看网| 亚洲无线码在线一区观看| 久久免费视频网站| 欧美性色19p| 国产z一区二区三区| 欧洲精品久久久| 欧美视频在线免费看| 日韩欧美999| 亚洲最新视频在线| 日日骚av一区| 久久人91精品久久久久久不卡| 亚洲精品成人久久电影| 亚洲女人天堂成人av在线| 亚洲电影免费观看高清完整版| 亚洲aa在线观看| 欧美自拍大量在线观看| 亚洲欧美日韩一区二区三区在线| 欧美性少妇18aaaa视频| 91精品久久久久久久久久久| 亚洲国产精品电影| 91久久久久久久久| 亚洲www视频| 亚洲第一福利网| 日韩成人网免费视频| 亚洲综合自拍一区| 91在线观看免费高清| 亚洲成人精品视频| 亚洲第一天堂无码专区| 亚洲欧美在线免费| 亚洲www永久成人夜色| 欧美激情日韩图片| 精品视频在线播放色网色视频| 97国产精品人人爽人人做| 国产精品老女人视频| 午夜精品一区二区三区视频免费看| 亚洲国产精品人久久电影| 亚洲二区中文字幕| 在线亚洲男人天堂| 裸体女人亚洲精品一区| 久久夜色精品国产| 国产一区二区丝袜高跟鞋图片| 国产精品偷伦免费视频观看的| 九九九久久国产免费| 96精品视频在线| www.亚洲一二| 国产精品久久国产精品99gif| 亚洲成人网久久久| 色一区av在线| 亚洲国产欧美精品| 欧美视频一区二区三区…| 中文字幕久热精品视频在线| 欧美日韩亚洲一区二区| 亚洲国产成人在线播放| 日韩毛片在线观看| 91国内免费在线视频| 狠狠躁夜夜躁人人爽超碰91| …久久精品99久久香蕉国产| 国产精品入口福利| 国产精品久久久久久av福利| 国产成人av网| 91精品国产自产91精品|