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

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

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

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

    [Design Pattern] The Factory Pattern

        作者:Flyingis

        工廠模式用于創(chuàng)建實例對象,我們只需告訴工廠需要的對象有什么特點,就能得到所需的結果,而不用去關心怎么創(chuàng)建對象,工廠類似于黑盒,黑盒里面關于對象生產(chǎn)的細節(jié)不是關注的重點。

        工廠模式分為:簡單工廠模式、工廠模式、抽象工廠模式。

        例子:Thinkpad筆記本生產(chǎn)線。

        簡單工廠模式

    public class SimpleThinkpadTFactory {
      
    public ThinkpadT produceThinkpadT(String type) {
        ThinkpadT thinkpadT 
    = null;
        
    // 根據(jù)不同的類型創(chuàng)建不同的Thinkpad
        if (type.equals("t60")) {
          thinkpadT 
    = new ThinkpadT60();
        }
     else if (type.equals("t60p")) {
          thinkpadT 
    = new ThinkpadT60p();
        }

      
    return thinkpadT;
      }

    }


    public class ThinkpadTStore {
      SimpleThinkpadTFactory factory;
      
    public ThinkpadTStore(SimpleThinkpadFactory factory) {
        
    this.factory = factory;
      }


      
    public ThinkpadT buyThinkpadT(String type) {
        ThinkpadT thinkpadT;
        
    // 不再根據(jù)不同條件,使用new去創(chuàng)建對象
        thinkpadT = factory.produceThinkpadT(type);
        
    return thinkpadT;
      }

    }


        從上例可以看出,SimpleThinkpadTFactory只需知道用戶需要什么型號的Thinkpad T系列的電腦,就能返回該型號Thinkpad的對象,避免了在ThinkpadTStore中書寫冗長的代碼,降低了代碼的耦合度。但是在SimpleThinkpadTFactory中,一旦機器的型號分的特別細、特別多,如T42/T43/T60/T42p/T43p/T60p等等,就需要維護大量的"if else",這顯然不是我們想看到的,這里我們引入工廠模式。

        工廠模式

    public abstract class ThinkpadTStore {
      
    public ThinkpadT buyThinkpadT(String type) {
        ThinkpadT thinkpadT;
        thinkpadT 
    = produceThinkpadT(type);
        
    return thinkpadT;
      }

      
    // 單獨抽取出工廠方法,abstract類型,需要在子類中實現(xiàn)
      abstract produceThinkpadT(String type);
    }


    public class ThinkpadT43Store extends ThinkpadTStore {
      ThinkpadT produceThinkpadT(String type) 
    {
        
    if (type.equals("T43")) {
          
    return new ThinpadT43();
        }
     else if (type.equals("T43p")) {
          
    return new ThinkpadT43p();
        }
     else return null;
      }

    }


    public class ThinkpadT60Store extends ThinkpadTStore {
      ThinkpadT produceThinkpadT(String type) 
    {
        
    if (type.equals("T60")) {
          
    return new ThinpadT60();
        }
     else if (type.equals("T60p")) {
          
    return new ThinkpadT60p();
        }
     else return null;
      }

    }


        具體執(zhí)行代碼:

    public class ThinpadTest {
      
    public static void main(String[] args) {
        ThinkpadTStore thinkpadT43Store 
    = new ThinkpadT43Store();
        ThinkpadTStore thinkpadT60Store 
    = new ThinkpadT60Store();

        ThinkpadT thinkpadT 
    = null;
        
    // 購買Thinkpad T43筆記本
        thinkpadT = thinkpadT43Store.buyThinkpadT("T43");
        
    // 購買Thinkpad T60p筆記本
        thinkpadT = thinkpadT60Store.buyThinkpadT("T60p");
      }

    }


        這樣就將不同型號T系列筆記本的生產(chǎn)進行了更細的劃分,降低了簡單工廠中工廠類的耦合程度,抽取出來的各種Store只用關心一種型號筆記本的生產(chǎn),如T43或T60。

        工廠模式的抽象結構圖可以表示如下:


        (上圖摘自Head First Patterns)

        抽象工廠模式

        什么時候需要使用抽象工廠模式呢?抽象工廠模式用戶生產(chǎn)線更復雜的情況下,例如現(xiàn)在除了T系列的Thinkpad筆記本,我們還需要生產(chǎn)R系列和X系列的產(chǎn)品,這時就需要更多的工廠來負責不同系列Thinkpad的生產(chǎn)。


        (上圖摘自呂震宇的博客)   

        有兩篇文章對于抽象工廠模式闡述的非常好:

        白話設計模式--Abstract Factory

        C#設計模式(6)--Abstract Factory Pattern

    posted on 2007-06-17 15:01 Flyingis 閱讀(3635) 評論(2)  編輯  收藏 所屬分類: 架構與設計

    評論

    # re: [Design Pattern] The Factory Pattern[未登錄]  回復  更多評論   

    請問樓主,文章中的可折疊的源代碼是怎樣生成的?是有工具生成的嗎?
    2007-06-20 13:29 | allen

    # re: [Design Pattern] The Factory Pattern  回復  更多評論   

    發(fā)布隨筆時,編輯器工具欄上有“插入代碼”,支持多種語言的編輯格式。
    2007-06-20 13:46 | Flyingis
    主站蜘蛛池模板: 香蕉大伊亚洲人在线观看| 黄色视屏在线免费播放| 亚洲综合色丁香婷婷六月图片| 成人免费区一区二区三区 | 免费精品国产自产拍在| 国产青草视频免费观看97 | 日韩中文无码有码免费视频| 国内精品久久久久影院亚洲| 成年大片免费视频| 亚洲成AV人在线观看天堂无码| 中国一级毛片免费看视频| 亚洲av无码无在线观看红杏| 亚洲国产午夜精品理论片在线播放| free哆拍拍免费永久视频| 国产精品成人免费一区二区| 亚洲产国偷V产偷V自拍色戒| 久草免费福利资源站| 亚洲无线一二三四区| 大学生高清一级毛片免费 | 亚洲av午夜精品无码专区| 一级毛片免费在线观看网站| 77777亚洲午夜久久多人| 亚洲欧美日韩中文高清www777| 日本免费无遮挡吸乳视频电影| 无码毛片一区二区三区视频免费播放| 国产亚洲精aa在线看| 国产成人免费手机在线观看视频| 无码免费又爽又高潮喷水的视频| 亚洲人成网亚洲欧洲无码久久| 直接进入免费看黄的网站| 女人18毛片特级一级免费视频 | 久久精品国产亚洲av麻豆| 在线观看免费人成视频色| 免费很黄无遮挡的视频毛片| 国产精品亚洲片在线观看不卡| 青青久久精品国产免费看| 西西人体44rt高清亚洲| 久久午夜夜伦鲁鲁片免费无码| 精品久久久久久亚洲精品| 亚洲国产成人久久一区久久| 热99RE久久精品这里都是精品免费|