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

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

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

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

  package com.javapatterns.factorymethod;
  
  public class BadPlantException extends Exception
  {
   public BadPlantException(String msg)
   {
  super(msg);
   }
  }
  代碼清單6. 例外類 BadPlantException。
  工廠方法模式應該在什么情況下使用
  既然工廠方法模式與簡單工廠模式的區別很是微妙,那么應該在什么情況下使用工廠方法模式,又應該在什么情況下使用簡單工廠模式呢?
  一般來說,假如你的系統不能事先確定那一個產品類在哪一個時刻被實例化,從而需要將實例化的細節局域化,并封裝起來以分割實例化及使用實例的責任時,你就需要考慮使用某一種形式的工廠模式。
  在我們的小花果園系統里,我們必須假設水果的種類隨時都有可能變化。我們必須能夠在引入新的水果品種時,能夠很少改動程序,就可以適應變化以后的情況。因此,我們顯然需要某一種形式的工廠模式。
  假如在發現系統只用一個產品類等級(hierarchy)就可以描述所有已有的產品類,以及可預見的未來可能引進的產品類時,簡單工廠模式是很好的解決方案。因為一個單一產品類等級只需要一個單一的實的工廠類。
  然而,當發現系統只用一個產品類等級不足以描述所有的產品類,包括以后可能要添加的新的產品類時,就應當考慮采用工廠方法模式。由于工廠方法模式可以容許多個實的工廠類,以每一個工廠類負責每一個產品類等級,因此這種模式可以容納所有的產品等級。
  在我們的小花果園系統里,不只有水果種類的植物,而且有蔬菜種類的植物。換言之,存在不止一個產品類等級。而且產品類等級的數目也隨時都有可能變化。因此,簡單工廠模式不能滿足需要,為解決向題,我們顯然需要工廠方法模式。
  關于模式的實現
  在實現工廠方法模式時,有下面一些值得討論的地方。
  第一丶在圖四的類圖定義中,可以對抽象工廠(Creator) 做一些變通。變通的種類有
  抽象工廠(Creator) 不是接口而是抽象類。一般而言,抽象類不提供一個缺省的工廠方法。 這樣可以有效地解決怎樣實例化事先不能預知的類的問題。
  抽象工廠(Creator) 本身是一個實類,并提供一個缺省的工廠方法。 這樣當最初的設計者所預見的實例化不能滿足需要時,后來的設計人員就可以用實工廠類的factory() 方法來置換(Override))父類中factory()方法。
  第二丶在經典的工廠方法模式中,factory()方法是沒有參量的。在本文舉例時加入了參量,這實際上也是一種變通。
  第三丶在給相關的類和方法取名字時,應當注重讓別人一看即知你是在使用工廠模式。
  COM技術架構中的工廠方法模式
  在微軟(Microsoft)所提倡的COM(Component Object Model)技術架構中, 工廠方法模式起著要害的作用。
  在COM架框里,Creator接口的角色是由一個叫作IClassFactory的COM接口來擔任的。而實類ConcreteCreator的角色是由實現IClassFactory接口的類CFactory(見下圖)來擔任的。一般而言,對象的創立可能要求分配系統資源,要求在不同的對象之間進行協調等等。因為IClassFactory的引進,所有這些在對象的創立過程中出現的細節問題, 都可以封裝在一個實現IClassFactory接口的實的工廠類里面。這樣一來, 一個COM架構的支持系統只需要創立這個工廠類CFactory的實例就可以了。
   爪哇語言工廠方法創立性模式介紹(下)(圖一)
  圖6. 微軟(Microsoft)的COM(Component Object Model)技術架構是怎樣工作的。 
  在上面的序列活動(Sequence Activity)圖中,用戶端調用COM的庫函數CoCreateInstance。 CoCreateInstance在COM架框中以CoGetClassObject實現。 CoCreateInstance會在視窗系統的Registry里搜尋所要的部件(在我們的例子中即CEmployee)。假如找到了這個部件,就會加載支持此部件的DLL。當此DLL加載成功后, CoGetClassObject就會調用DllGetClassObject。后者使用new操作符將工廠類CFactory實例化。
  下面,DllGetClassObject會向工廠類CFactory搜詢IClassFactory接口,返還給CoCreateInstance。 CoCreateInstance接下來利用IClassFactory接口調用CreateInstance函數。此時,IClassFactory::CreateInstance調用new操作符來創立所要的部件(CEmployee)。此外,它搜詢IEmployee接口。在拿到接口的指針后, CoCreateInstance釋放掉工廠類并把接口的指針返還給客戶端。
  客戶端現在就可以利用這個接口調用此部件中的方法了。
  EJB技術架構中的工廠方法模式
  升陽(Sun Microsystem)倡導的EJB(EnterPRise Java Beans)技術架構是一套為爪哇語言設計的, 用來開發企業規模應用程序的組件模型。我們來舉例看一看EJB架構是怎樣利用工廠方法模式的。請考察下面的序列活動圖。
   爪哇語言工廠方法創立性模式介紹(下)(圖二)
  圖7. 在升陽所提倡的EJB技術架構中, 工廠方法模式也起著要害的作用 
  在上面的圖中,用戶端創立一個新的 Context 對象,以便利用 JNDI 伺服器尋找 EJBObject。在得到這個 Context 對象后,就可以使用 JNDI 名, 比如"Employee", 來拿到 EJB 類 Employee 的 Home 接口。使用 Employee 的 Home 接口,客戶端可以創立 EJB 對象,比如 EJB 類 Employee 的實例 emp, 然后調用 Employee 的各個方法。
  // 取到 JNDI naming context
  Context ctx = new InitialContext ();
  // 利用ctx 索取 EJB Home 接口
  EmployeeHome home = (EmployeeHome)ctx.lookup("Employee");
  // 利用Home 接口創立一個 session Bean 對象
  // 這里使用的是標準的工廠方法模式
  Employee emp = home.create (1001, "John", "Smith");
  // 調用方法
  emp.setTel ("212-657-7879");
  代碼清單7. EJB架構中,Home接口提供工廠方法以便用戶端可以動態地創立EJB類Employee的實例。
  JMS技術架構中的工廠方法模式
  JMS定義了一套標準的API,讓爪哇語言程序能通過支持JMS標準的MOM(Message Oriented Middleware 面向消息的中間伺服器)來創立和交換消息(message)。我們來舉例看一看JMS(Java Messaging Service)技術架構是怎樣使用工廠方法模式的。
   爪哇語言工廠方法創立性模式介紹(下)(圖三)
  圖8. 在JMS技術架構中, 工廠方法模式無處不在 
  在上面的序列圖中,用戶端創立一個新的 Context 對象,以便利用 JNDI 伺服器尋找 Topic 和 ConnectionFactory 對象。在得到這個 ConnectionFactory 對象后, 就可以利用 Connection 創立 Session 的實例。有了 Session 的實例后,就可以利用 Session 創立 TopicPublisher的實例,并利用Session創立消息實例。
  Properties prop = new Properties();
  prop.put(Context.INITIAL_CONTEXT_FACTORY,
  "com.sun.jndi.fscontext.RefFSContextFactory");
  prop.put(Context.PROVIDER_URL, "file:C:/temp");
  // 取到 JNDI context
  Context ctx = new InitialContext(prop);
  // 利用ctx 索取工廠類的實例
  Topic topic = (Topic) ctx.lookup("myTopic");
  TopicConnectionFactory tcf = (TopicConnectionFactory) ctx.lookup("myTCF");
  // 利用工廠類創立Connection,這是典型的工廠模式
  TopicConnection tCon = tcf.createTopicConnectoin();
  // 利用Connection創立Session的實例,又是工廠模式
  TopicSession tSess = tCon.createTopicSession(false,
  Session.AUTO_ACKNOWLEDGE);
  // 利用Session創立ProdUCer的實例,又是工廠模式
  TopicPublisher publisher = tSess.createPublisher(topic);
  // 利用Session創立消息實例,又是工廠模式
  TextMesage msg = tSess.createTextMessage("Hello from Jeff");
  //發送消息
  publisher.publish(msg);
  代碼清單8.
  JMS架構中,工廠模式被用于創立 Connection, Session, Producer 的實例。
  問答題
  第1題、在這一節和上一節的類圖中,我注重到Apple類的類圖與Strawberry類的類圖有一點點不同。在Apple類的類圖左上角有一個夾子樣的標識。請問這個標識代表什么意思。
  第2題、在這一節的類圖4中,我注重到 ConcreteProduct 類只出現一次,但實現 Product 接口的類實際上可以有很多。這是否可以用在聯接 Product 和 ConcreteProduct 之間的線旁注上 1,2,... 表示呢? 記得我在UML圖中曾見過這種記號。
  第3題、請問在本節的小花果園系統的源代碼清單4里,Broccoli 類實現兩個接口,VeggieIF 和 PlantIF。只有 PlantIF 才與工廠模式有關。為什么不把 VeggieIF 接口合并到 PlantIF 接口中去?
  第4題、請問在工廠方法模式中,產品(Product) 何時應是抽象類,何時應是接口?
  第5題、請問在工廠方法 (factory())中,為什么要使用 if 語句作過程性判定來決定創立哪一個產品類,而不使用多形性原則 (Polymorphsm) 來創立產品類?
  問答題答案
  第1題、Apple類有性質(property),而Strawberry類沒有性質。
  一個類的成員變量叫做屬性(attribute)。性質與屬性的區別在于性質是帶著一套取值丶賦值方法的屬性。一個類有了屬性,其類圖左上角就會有一只夾子。有些人認為,一個爪哇類有了屬性才能被稱做爪哇豆(Java Bean)。這只夾子就表示這個類是一只豆。
  一個企業爪哇豆,或 EJB (Enterprise JavaBean) 的類圖左上角也會有一只夾子,夾子上面有一個E字以示與普通的爪哇豆的不同(請見下圖)。
  爪哇語言工廠方法創立性模式介紹(下)(圖四)
  第2題、不能。在圖4中聯接 Product 和 ConcreteProduct 之間的線有兩條,一條表示兩者之間的推廣關系 (即有向上箭頭的),另一條表示兩者之間

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩美女激情视频| 青青在线视频一区二区三区| 日韩一区二区欧美| 久久久久久久影院| 欧美日韩福利视频| 国产精品国产三级国产aⅴ浪潮| 久久国产精品网站| 亚洲第一级黄色片| 日韩欧美国产高清91| 国产日韩中文字幕| 亚洲美女久久久| 国产精品高潮在线| 国产日产久久高清欧美一区| 欧美电影免费观看高清| 日韩欧美中文在线| 久久69精品久久久久久久电影好| 精品视频www| 日韩av一区二区在线观看| 日韩欧美中文在线| 日韩在线视频观看| 欧美最猛黑人xxxx黑人猛叫黄| 欧美与欧洲交xxxx免费观看| 欧美日韩国产色视频| 欧美日韩午夜视频在线观看| 成人午夜在线影院| 亚洲欧洲xxxx| 久久久久久亚洲精品不卡| 亚洲一区999| 亚洲激情成人网| 亚洲女人天堂成人av在线| 亚洲欧美另类自拍| 日本欧美一二三区| 欧美日韩成人在线观看| 波霸ol色综合久久| 国产精品综合不卡av| 欧美激情网友自拍| 日韩av成人在线观看| 亚洲欧美日韩第一区| 1769国内精品视频在线播放| 日韩亚洲欧美中文高清在线| 日韩av片永久免费网站| 日韩中文字幕精品视频| 国产a∨精品一区二区三区不卡| 日韩精品视频免费| 日本高清+成人网在线观看| 97国产精品久久| 久久国产精品首页| 成人av番号网| 日韩女优人人人人射在线视频| 91精品视频专区| 亚洲美女免费精品视频在线观看| 一本一本久久a久久精品牛牛影视| 久久久精品国产亚洲| 成人欧美一区二区三区在线| 在线播放国产一区中文字幕剧情欧美| 欧美成人午夜激情在线| 欧美激情第1页| 日韩中文字幕欧美| 久久精品成人动漫| 国产日韩欧美91| 亚洲综合一区二区不卡| 68精品久久久久久欧美| 亚洲欧美在线磁力| 欧美成人精品xxx| 日韩美女视频中文字幕| 国产精品免费一区豆花| 91人成网站www| 精品国产福利在线| 欧美精品在线极品| 一区二区三区久久精品| 国产精品自产拍在线观看中文| 高清欧美性猛交xxxx| 66m—66摸成人免费视频| 最新的欧美黄色| 亚洲欧洲在线免费| 中日韩美女免费视频网站在线观看| 俺去亚洲欧洲欧美日韩| 国产精品成人品| 91a在线视频| 亚洲精品第一国产综合精品| 国产精品三级美女白浆呻吟| 成年无码av片在线| 国产91精品黑色丝袜高跟鞋| 伊人久久久久久久久久久| 日韩在线观看免费全集电视剧网站| 91精品久久久久久久久久| 亚洲人成在线观看网站高清| 国产精品白丝jk喷水视频一区| 国产专区欧美专区| 日本高清久久天堂| 日韩视频欧美视频| 亚洲激情在线观看视频免费| 中文字幕日韩高清| 日韩精品免费在线视频观看| 欧美激情亚洲国产| 91高清免费视频| 精品国产31久久久久久| 久久精品视频在线观看| 亚洲人精品午夜在线观看| 欧洲日本亚洲国产区| 欧美成人在线免费| 色噜噜狠狠狠综合曰曰曰88av| 国产精品自拍小视频| 青草热久免费精品视频| 欧美激情在线视频二区| 亚洲激情在线观看| 国产精品爽爽爽爽爽爽在线观看| 在线丨暗呦小u女国产精品| 欧美在线播放视频| 欧美性猛交99久久久久99按摩| 成人动漫网站在线观看| 国产91精品视频在线观看| 成人福利网站在线观看11| 一本色道久久88综合亚洲精品ⅰ| 亚洲剧情一区二区| 中文字幕亚洲欧美一区二区三区| 不卡伊人av在线播放| www.久久撸.com| 国产精品日日做人人爱| 亚洲欧洲黄色网| 中文字幕亚洲精品| 97精品久久久中文字幕免费| 国产欧美精品va在线观看| 亚洲免费一级电影| 欧美一二三视频| 欧美最顶级丰满的aⅴ艳星| 亚洲高清一区二| 亚洲国产精品高清久久久| 亚洲国产三级网| 国内精品国产三级国产在线专| 欧美激情中文字幕乱码免费| 91沈先生作品| 欧美一区二区三区……| 中文字幕精品久久久久| 中文字幕欧美在线| …久久精品99久久香蕉国产| 亚洲白虎美女被爆操| 成人久久精品视频| 国产欧美一区二区三区久久| 欧美日韩亚洲网| 久久免费视频在线观看| 久久久久久久色| 成人黄色大片在线免费观看| 精品亚洲va在线va天堂资源站| 精品免费在线观看| 欧美在线免费观看| 亚洲精品色婷婷福利天堂| 日韩电影免费观看在线观看| 国产精品视频男人的天堂| 欧美又大又硬又粗bbbbb| 不卡av电影院| 18性欧美xxxⅹ性满足| 91精品国产高清久久久久久| 欧美精品www| 91精品视频在线免费观看| 久久久久久久网站| 日韩最新免费不卡| 亚洲国产成人91精品| 亚洲xxxx妇黄裸体| 国产综合在线看| 日韩精品在线看| 国产一区二区三区在线| 亚洲最大中文字幕| 欧美日韩亚洲精品一区二区三区|