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

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

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

    無(wú)為

    無(wú)為則可為,無(wú)為則至深!

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

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

    先說(shuō)簡(jiǎn)單工廠模式:
    需求:一個(gè)水果工廠,為任何來(lái)的客人提供水果,現(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)
    try{
    ?FruitFactory.factory("apple");
    ?FruitFactory.factory("banana");
    ?FruitFactory.factory("orange");
    }catch(Exception e){
    ?......
    }
    優(yōu)點(diǎn):分開了生產(chǎn)者和消費(fèi)者的責(zé)任
    缺點(diǎn):所有的產(chǎn)品都出自一個(gè)工廠
    造成問(wèn)題:
    1,當(dāng)這個(gè)工廠出現(xiàn)問(wèn)題時(shí),損失慘重,不利于分散風(fēng)險(xiǎn)
    2,當(dāng)出現(xiàn)不同種類的水果(有不同接口的水果),工場(chǎng)內(nèi)部既須要判斷種類,又須要判斷具體的產(chǎn)品。
    比如這中結(jié)構(gòu):
    1,水果接口Fruit
    2,兩個(gè)種類水果實(shí)現(xiàn)了Fruit接口?? 有籽水果 /無(wú)籽水果
    3,所有有籽水果繼承自有籽水果?? ,所有無(wú)籽水果繼承自無(wú)籽水果

    這事如果客戶要有籽西瓜,無(wú)籽西瓜 工廠類的實(shí)現(xiàn)
    -----------------------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個(gè)大分類,復(fù)雜的層次結(jié)構(gòu),那么這個(gè)工廠模式怎么維護(hù)。
    總結(jié)一下:簡(jiǎn)單工廠方法,在一定程度上支持了開閉原則,當(dāng)增加一種水果的時(shí)候符合開閉原則
    ??但當(dāng)增加一類水果(多種有共通特點(diǎn)的水果)時(shí)候,出現(xiàn)維護(hù)困難的問(wèn)題。
    ??
    這個(gè)時(shí)候引入工廠方法,工廠方法利用繼承,解決了上邊的問(wèn)題。看看它是如何解決的。
    簡(jiǎn)單來(lái)說(shuō):工廠方法就是為沒(méi)一大類水果實(shí)現(xiàn)一個(gè)"簡(jiǎn)單工廠",這些"簡(jiǎn)單工廠"都實(shí)現(xiàn)一個(gè)共通的接口。
    這樣當(dāng)然就解決了問(wèn)題,添加一個(gè)大類的話,就添加一個(gè)簡(jiǎn)單工廠

    在我們的日常生活中經(jīng)常會(huì)遇到這樣的情況,如要生產(chǎn)IBM-PC或者Apple ,每一臺(tái)計(jì)算計(jì)又有Cpu和內(nèi)存
    IBM-PC Apple,Cpu 內(nèi)存Ram 不是一類東西,這個(gè)時(shí)候如果簡(jiǎn)單的建立四個(gè)工廠類是不對(duì)的。解決辦法:
    -----------------------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--------------------------------
    這個(gè)就使抽象工廠了,不過(guò)抽象工廠對(duì)開閉原則的支持不夠好,只在機(jī)型的增加上支持開閉,在配件上就不行了。

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

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

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



    凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
    、轉(zhuǎn)載請(qǐng)注明來(lái)處和原文作者。非常感謝。

    posted on 2006-11-08 22:56 草兒 閱讀(285) 評(píng)論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 最新国产AV无码专区亚洲| 亚洲欧洲日本精品| 国产成人免费视频| 国产亚洲精品bv在线观看| 免费人成在线观看播放国产| 久青草视频97国内免费影视| 亚洲午夜一区二区电影院| 亚洲А∨精品天堂在线| 久久免费观看国产99精品| 亚洲成av人片在线天堂无| 亚洲人成77777在线播放网站| 久久受www免费人成_看片中文| 免费一区二区三区在线视频| 亚洲最大的成网4438| 亚洲av再在线观看| 69堂人成无码免费视频果冻传媒| 日本一区二区在线免费观看 | 全免费a级毛片免费看不卡| 中美日韩在线网免费毛片视频 | 好男人资源在线WWW免费| 亚洲精品456人成在线| 亚洲gv猛男gv无码男同短文| 国产真实伦在线视频免费观看| 最近2022中文字幕免费视频| 一级毛片免费在线| 亚洲人片在线观看天堂无码| 亚洲精品高清久久| 亚洲人成网77777亚洲色| 免费看国产一级特黄aa大片| 成人浮力影院免费看| 99久久国产精品免费一区二区| 亚洲日韩精品无码AV海量| 青青草原精品国产亚洲av| 国产亚洲一区二区手机在线观看 | 中文在线免费观看| 亚洲av片在线观看| 丁香婷婷亚洲六月综合色| 亚洲人成在线影院| 亚洲国产精品无码专区在线观看| 国产99视频免费精品是看6| 在线观看免费人成视频|