DANCE WITH JAVA

          開發(fā)出高質(zhì)量的系統(tǒng)

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          好友之家

          最新評(píng)論

          Java中的模式 --工廠模式

          工廠模式主要負(fù)責(zé)將大量有共通接口的類實(shí)例化,工場模式有以下幾種形態(tài)
          簡單工廠(Simple Factory)   又稱 靜態(tài)工廠方法(Static Factory Method)
          工廠方法(Factory Method)   又稱 多態(tài)性工廠(Polymorphic Factory)
          抽象工廠(Abstract Factory) 又稱 工具箱(Kit or Toolkit)

          先說簡單工廠模式:
          需求:一個(gè)水果工廠,為任何來的客人提供水果,現(xiàn)有水果Apple ,Banana,Orange
          實(shí)現(xiàn):
          定義三個(gè)類Apple,Banana,Orange 讓他們都實(shí)現(xiàn)Fruit接口

          ----------------------- list  1 --------------------------------
          public   class  FruitFactory {
           
          public   static  Fruit factory(String which) {
            
          if (which.equalsIgnoreCase( " apple " ) {
             
                       return new Apple();
            }
          else   if (which equalsIgnoreCase( " banana " )) {
             
                       return new Banana();
            }
          else   if (which equalsIgnoreCase( " orange " )) {
             
                       return new Orange();
            }
          else {
                         
          throw  RuntimeException( " no this fruit " );
            }

           }

          }

          ----------------------- list  1 --------------------------------


          客人的需求實(shí)現(xiàn)

          1 try {
          2  FruitFactory.factory( " apple " );
          3  FruitFactory.factory( " banana " );
          4  FruitFactory.factory( " orange " );
          5 }
          catch (Exception e) {
          6  
          7 }

          8


          優(yōu)點(diǎn):分開了生產(chǎn)者和消費(fèi)者的責(zé)任
          缺點(diǎn):所有的產(chǎn)品都出自一個(gè)工廠
          造成問題:
          1,當(dāng)這個(gè)工廠出現(xiàn)問題時(shí),損失慘重,不利于分散風(fēng)險(xiǎn)
          2,當(dāng)出現(xiàn)不同種類的水果(有不同接口的水果),工場內(nèi)部既須要判斷種類,又須要判斷具體的產(chǎn)品。
          比如這種結(jié)構(gòu):
          1,水果接口Fruit
          2,兩個(gè)種類水果實(shí)現(xiàn)了Fruit接口   有籽水果 /無籽水果
          3,所有有籽水果繼承自有籽水果類   ,所有無籽水果繼承自無籽水果類

          這事如果客戶要有籽西瓜,無籽西瓜 工廠類的實(shí)現(xiàn)

           1 ----------------------- list  2 --------------------------------
           2 public   class  FruitFactory {
           3   public   static  Fruit factory(String which, boolean  hasSeed ) {
           4    if (hasSeed) {
           5     if (which.equalsIgnoreCase( " watermelon  " ) {
           6      return   new  WatermelonOne();
           7    }
          else   if (which equalsIgnoreCase( " orange " )) {
           8      return   new  OrangeOne();
           9     else {
          10      throw  RuntimeException( " no this fruit " );
          11    }

          12   }
          else {
          13     if (which.equalsIgnoreCase( " watermelon  " ) {
          14      return   new  WatermelonTwo();
          15    }
          else   if (which equalsIgnoreCase( " orange " )) {
          16      return   new  OrangeTwo();
          17     else {
          18      throw  RuntimeException( " no this fruit " );
          19    }

          20   }

          21  }

          22 }

          23 ----------------------- list  2 --------------------------------
          24


          接著試想一下,我有20個(gè)大分類,復(fù)雜的層次結(jié)構(gòu),那么這個(gè)工廠模式怎么維護(hù)。
          總結(jié)一下:簡單工廠方法,在一定程度上支持了開閉原則,當(dāng)增加一種水果的時(shí)候符合開閉原則
            但當(dāng)增加一類水果(多種有共通特點(diǎn)的水果)時(shí)候,出現(xiàn)維護(hù)困難的問題。
            
          這個(gè)時(shí)候引入工廠方法,工廠方法利用繼承,解決了上邊的問題。看看它是如何解決的。
          簡單來說:工廠方法就是為沒一大類水果實(shí)現(xiàn)一個(gè)"簡單工廠",這些"簡單工廠"都實(shí)現(xiàn)一個(gè)共通的接口。
          這樣當(dāng)然就解決了問題,添加一個(gè)大類的話,就添加一個(gè)簡單工廠

          在我們的日常生活中經(jīng)常會(huì)遇到這樣的情況,如要生產(chǎn)IBM-PC或者Apple ,每一臺(tái)計(jì)算計(jì)又有Cpu和內(nèi)存
          IBM-PC Apple,Cpu 內(nèi)存Ram 不是一類東西,這個(gè)時(shí)候如果簡單的建立四個(gè)工廠類是不對(duì)的。解決辦法:

           1 ----------------------- list  3 --------------------------------
           2 public  IbmPcFactory {
           3   public  Cpu CpuFactory(String cpuType) {
           4    return   new  IbmPcCpu(cpuType);
           5  }

           6   public  Ram RamFactory(String ramType) {
           7    return   new  IbmPcRam(ramType);
           8  }

           9 }

          10 public  AppleFactory() {
          11   public  Cpu CpuFactory(String cpuType) {
          12    return   new  AppleCpu(cpuType);
          13  }

          14   public  Ram RamFactory(String ramType) {
          15    return   new  AppleRam(ramType);
          16  }

          17 }

          18 ----------------------- list  3 --------------------------------
          19


          這個(gè)就使抽象工廠了,不過抽象工廠對(duì)開閉原則的支持不夠好,只在機(jī)型的增加上支持開閉,在配件上就不行了。

          對(duì)比三個(gè)工廠模式,<<Java與模式>>的作者的比喻更能讓人明白問題。

          1,話說女媧造人,開始用手捏,感覺太慢
          2,所以女媧想出了辦法,用一條繩子(簡單工廠,告訴繩子怎么造人),放到泥堆里邊,然後一抖,就出來一批人
          (簡單工廠須要一個(gè)接口,interface 人)
          3,接著女媧想要男人和女人之分,所以造了兩條繩子,陽繩和陰繩(工廠方法,兩個(gè)工廠,告訴陽繩怎么造男人,
          女繩怎么造女人),然後一下出來一批男人,一批女人
          (工廠方法須要多個(gè)接口,interface 人  interface 繩  陽繩-陰繩實(shí)現(xiàn)繩 男人-女人實(shí)現(xiàn)人)
          4,可女媧還想造點(diǎn)動(dòng)物,而且動(dòng)物也想分男女(其實(shí)應(yīng)改是雌雄),那怎么辦,改造兩條繩子,讓繩子也學(xué)會(huì)怎么
          造動(dòng)物(抽象工廠),這個(gè)時(shí)候抖一下繩子,陽繩出來的東西,長的像人的是男人,長的像動(dòng)物的是雄動(dòng)物,
          (抽象工廠須要再多的接口 interface 人 interface 獸 interface 繩
          陽繩-陰繩實(shí)現(xiàn)繩 男人-女人實(shí)現(xiàn)人 雌動(dòng)物-雄動(dòng)物實(shí)現(xiàn)獸)
          陰繩出來的東西,長的像人的是女人,長的像動(dòng)物的是雌動(dòng)物

          最后再回到實(shí)現(xiàn)上,看到在list 1中,出現(xiàn)了大量的
          if(which.equalsIgnoreCase("xxx"){
             return new Xxx();
          }
          試想如果產(chǎn)品上千,上萬呢。那這個(gè)將是不可想想的。Java的動(dòng)態(tài)load正好解決了這個(gè)問題
          看看實(shí)現(xiàn)

           1 public   class  FruitFactory {
           2   public   static  Fruit factory(String which) {
           3    try {
           4    Class clazz  =  Class.forName(which);
           5     return  (Fruit)clazz.newInstance();
           6   }
          catch (Exception e) {
           7    
           8   }

           9  }

          10 }

          11


          好了,這個(gè)時(shí)候無論增加多少類的產(chǎn)品都不是問題了,你只要讓所有的產(chǎn)品實(shí)現(xiàn)Fruit接口,同時(shí)為每個(gè)產(chǎn)品
          編寫自己的類。完全符合開閉原則。

           

           


              
              

          posted on 2006-11-07 15:02 dreamstone 閱讀(3538) 評(píng)論(3)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

          評(píng)論

          # re: Java中的模式 --工廠模式 2006-11-08 18:43 xiaosilent

          學(xué)習(xí)ing....

          把代碼編輯成代碼片段吧,看起來會(huì)舒服很多吧。  回復(fù)  更多評(píng)論   

          # re: Java中的模式 --工廠模式 2006-11-09 09:35 dreamstone

          嗯,以前不知道可以把代碼編輯成代碼塊,呵呵。
          昨天才知到,我會(huì)慢慢把這些都改成代碼塊的。
          謝謝你的意見  回復(fù)  更多評(píng)論   

          # re: Java中的模式 --工廠模式 2006-12-12 22:18 slx

          Client:Button ,Text Factory:linux ,windows
          Client:水果,蔬菜 Factory:大棚,非大棚
          Client:簡裝版系統(tǒng),完全版系統(tǒng) Factory:Linux版 windows版
          角色(是什么來分,類似繼承) 族(相似性來分類似接口)

          simple 單根,單層繼承
          method 單根,多層繼承
          abstract 多跟,多層繼承,不同角度
            回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 喀喇沁旗| 新乡市| 荥阳市| 江山市| 棋牌| 东乌| 郯城县| 九龙城区| 安阳县| 礼泉县| 保定市| 胶州市| 驻马店市| 桦甸市| 肥西县| 开原市| 嘉祥县| 慈溪市| 津南区| 宽甸| 剑阁县| 新密市| 裕民县| 大关县| 永泰县| 晋宁县| 虹口区| 金秀| 泰宁县| 泸水县| 天长市| 永善县| 抚顺县| 正安县| 密云县| 上栗县| 化州市| 文水县| 乌海市| 盖州市| 怀来县|