<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    DANCE WITH JAVA

    開發出高質量的系統

    常用鏈接

    統計

    積分與排名

    好友之家

    最新評論

    Java中的模式 --工廠模式

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

    先說簡單工廠模式:
    需求:一個水果工廠,為任何來的客人提供水果,現有水果Apple ,Banana,Orange
    實現:
    定義三個類Apple,Banana,Orange 讓他們都實現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 --------------------------------


    客人的需求實現

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

    8


    優點:分開了生產者和消費者的責任
    缺點:所有的產品都出自一個工廠
    造成問題:
    1,當這個工廠出現問題時,損失慘重,不利于分散風險
    2,當出現不同種類的水果(有不同接口的水果),工場內部既須要判斷種類,又須要判斷具體的產品。
    比如這種結構:
    1,水果接口Fruit
    2,兩個種類水果實現了Fruit接口   有籽水果 /無籽水果
    3,所有有籽水果繼承自有籽水果類   ,所有無籽水果繼承自無籽水果類

    這事如果客戶要有籽西瓜,無籽西瓜 工廠類的實現

     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個大分類,復雜的層次結構,那么這個工廠模式怎么維護。
    總結一下:簡單工廠方法,在一定程度上支持了開閉原則,當增加一種水果的時候符合開閉原則
      但當增加一類水果(多種有共通特點的水果)時候,出現維護困難的問題。
      
    這個時候引入工廠方法,工廠方法利用繼承,解決了上邊的問題。看看它是如何解決的。
    簡單來說:工廠方法就是為沒一大類水果實現一個"簡單工廠",這些"簡單工廠"都實現一個共通的接口。
    這樣當然就解決了問題,添加一個大類的話,就添加一個簡單工廠

    在我們的日常生活中經常會遇到這樣的情況,如要生產IBM-PC或者Apple ,每一臺計算計又有Cpu和內存
    IBM-PC Apple,Cpu 內存Ram 不是一類東西,這個時候如果簡單的建立四個工廠類是不對的。解決辦法:

     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


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

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

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

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

     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


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

     

     


        
        

    posted on 2006-11-07 15:02 dreamstone 閱讀(3531) 評論(3)  編輯  收藏 所屬分類: 設計模式

    評論

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

    學習ing....

    把代碼編輯成代碼片段吧,看起來會舒服很多吧。  回復  更多評論   

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

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

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

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

    simple 單根,單層繼承
    method 單根,多層繼承
    abstract 多跟,多層繼承,不同角度
      回復  更多評論   

    主站蜘蛛池模板: 亚洲videosbestsex日本| 91嫩草私人成人亚洲影院| 亚洲人成色99999在线观看| 欧美最猛性xxxxx免费| 亚洲人成片在线观看| 无码国产精品一区二区免费虚拟VR| 1区1区3区4区产品亚洲| 91精品手机国产免费| 亚洲同性男gay网站在线观看| 国产在线观看免费观看不卡| 亚洲AV无码久久久久网站蜜桃| 国产在线观看片a免费观看| 亚洲人成自拍网站在线观看| 成人午夜大片免费7777| 国产AV无码专区亚洲AV麻豆丫| 亚洲国产精品专区在线观看| 国产免费久久精品丫丫| 亚洲日本中文字幕| 最近2019中文免费字幕| 国产在亚洲线视频观看| 亚洲乱亚洲乱妇无码麻豆| 污污网站18禁在线永久免费观看| 亚洲欧洲精品在线| 国产精品无码一区二区三区免费| 污污污视频在线免费观看| 亚洲2022国产成人精品无码区 | 国产日韩在线视频免费播放| 亚洲av之男人的天堂网站| 色片在线免费观看| 男女超爽视频免费播放| 亚洲av无码不卡一区二区三区| 免费无码AV片在线观看软件| 特级av毛片免费观看| 亚洲电影一区二区| 日韩免费高清视频网站| 你是我的城池营垒免费看| 亚洲中文字幕无码mv| 国产精品亚洲片在线观看不卡| 毛片基地免费观看| 日韩精品免费在线视频| 爱情岛亚洲论坛在线观看|