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

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

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

    無為

    無為則可為,無為則至深!

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

    工廠模式主要負責將大量有共通接口的類實例化,工場模式有以下幾種形態
    簡單工廠(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--------------------------------
    客人的需求實現
    try{
    ?FruitFactory.factory("apple");
    ?FruitFactory.factory("banana");
    ?FruitFactory.factory("orange");
    }catch(Exception e){
    ?......
    }
    優點:分開了生產者和消費者的責任
    缺點:所有的產品都出自一個工廠
    造成問題:
    1,當這個工廠出現問題時,損失慘重,不利于分散風險
    2,當出現不同種類的水果(有不同接口的水果),工場內部既須要判斷種類,又須要判斷具體的產品。
    比如這中結構:
    1,水果接口Fruit
    2,兩個種類水果實現了Fruit接口?? 有籽水果 /無籽水果
    3,所有有籽水果繼承自有籽水果?? ,所有無籽水果繼承自無籽水果

    這事如果客戶要有籽西瓜,無籽西瓜 工廠類的實現
    -----------------------list 2--------------------------------
    public class FruitFactory{
    ?public static Fruit factory(String which,boolean hasSeed ){
    ??if(hasSeed){
    ???if(which.equalsIgnoreCase("watermelon "){
    ????return new WatermelonOne();
    ???}else if(which equalsIgnoreCase("orange")){
    ????return new OrangeOne();
    ???else{
    ????throw RuntimeException("no this fruit");
    ???}
    ??}else{
    ???if(which.equalsIgnoreCase("watermelon "){
    ????return new WatermelonTwo();
    ???}else if(which equalsIgnoreCase("orange")){
    ????return new OrangeTwo();
    ???else{
    ????throw RuntimeException("no this fruit");
    ???}
    ??}
    ?}
    }
    -----------------------list 2--------------------------------
    接著試想一下,我有20個大分類,復雜的層次結構,那么這個工廠模式怎么維護。
    總結一下:簡單工廠方法,在一定程度上支持了開閉原則,當增加一種水果的時候符合開閉原則
    ??但當增加一類水果(多種有共通特點的水果)時候,出現維護困難的問題。
    ??
    這個時候引入工廠方法,工廠方法利用繼承,解決了上邊的問題。看看它是如何解決的。
    簡單來說:工廠方法就是為沒一大類水果實現一個"簡單工廠",這些"簡單工廠"都實現一個共通的接口。
    這樣當然就解決了問題,添加一個大類的話,就添加一個簡單工廠

    在我們的日常生活中經常會遇到這樣的情況,如要生產IBM-PC或者Apple ,每一臺計算計又有Cpu和內存
    IBM-PC Apple,Cpu 內存Ram 不是一類東西,這個時候如果簡單的建立四個工廠類是不對的。解決辦法:
    -----------------------list 3--------------------------------
    public IbmPcFactory{
    ?public Cpu CpuFactory(String cpuType){
    ??return new IbmPcCpu(cpuType);
    ?}
    ?public Ram?RamFactory(String ramType){
    ??return new IbmPcRam(ramType);
    ?}
    }
    public AppleFactory(){
    ?public Cpu CpuFactory(String cpuType){
    ??return new AppleCpu(cpuType);
    ?}
    ?public Ram?RamFactory(String ramType){
    ??return new AppleRam(ramType);
    ?}
    }
    -----------------------list 3--------------------------------
    這個就使抽象工廠了,不過抽象工廠對開閉原則的支持不夠好,只在機型的增加上支持開閉,在配件上就不行了。

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

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

    最后再回到實現上,看到在list 1中,出現了大量的
    if(which.equalsIgnoreCase("xxx"){
    ???return new Xxx();
    }
    試想如果產品上千,上萬呢。那這個將是不可想想的。Java的動態load正好解決了這個問題
    看看實現
    public class FruitFactory{
    ?public static Fruit factory(String which){
    ??try{
    ???Class clazz = Class.forName(which);
    ???return (Fruit)clazz.newInstance();
    ??}catch(Exception e){
    ???......
    ??}
    ?}
    }
    好了,這個時候無論增加多少類的產品都不是問題了,你只要讓所有的產品實現Fruit接口,同時為每個產品
    編寫自己的類。完全符合開閉原則。



    凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
    、轉載請注明來處和原文作者。非常感謝。

    posted on 2006-11-08 22:56 草兒 閱讀(285) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 特级毛片aaaa级毛片免费| 99久久免费国产香蕉麻豆| 亚洲视频中文字幕| 巨波霸乳在线永久免费视频| 日韩亚洲Av人人夜夜澡人人爽 | 足恋玩丝袜脚视频免费网站| 午夜影视日本亚洲欧洲精品一区| a毛看片免费观看视频| 国产AV无码专区亚洲AVJULIA| 国产婷婷成人久久Av免费高清| 亚洲av午夜福利精品一区| 久久免费的精品国产V∧| 亚洲精品亚洲人成在线观看麻豆| 麻豆视频免费播放| 亚洲日产乱码一二三区别| 国产伦精品一区二区三区免费迷| 日本激情猛烈在线看免费观看| 中文字幕在亚洲第一在线| 久久国产精品免费观看| 亚洲六月丁香六月婷婷蜜芽| 热久久精品免费视频| xxxxx做受大片在线观看免费 | 亚洲久悠悠色悠在线播放| 男女交性永久免费视频播放| 成年网在线观看免费观看网址| 亚洲午夜未满十八勿入网站2| 一级毛片免费毛片一级毛片免费| 亚洲人成电影青青在线播放| 国产色爽免费视频| a级黄色毛片免费播放视频| 亚洲成A∨人片在线观看无码| 白白国产永久免费视频| 两个人看的www高清免费观看| 亚洲精品**中文毛片| 免费看一级做a爰片久久| 免费91麻豆精品国产自产在线观看 | 最新国产成人亚洲精品影院| 免费一级黄色毛片| 久久久久久一品道精品免费看| 亚洲AV男人的天堂在线观看|