• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-379  評論-37  文章-0  trackbacks-0
            1. 描述:
                   抽象工廠是一個適用于創建一系列相關的產品的創建性模型.比如設計模式書中經常講的那個例子-支持多視感窗口的工具包,比如windows和motif風格,這個是風格族.每種風格下面都有些標準的產品族,象BUTTON, TextBox, ListBox等.試想一下,如果直接在client中指定具體產品和它的風格,那么會出現2*3 = 6中組合,如果新增一種產品或風格,那么組合會以倍數增加,看來這樣的做法是很愚蠢的.所以還是以面向對象的幾個原則來分析一下這個問題,首先可以看出此問題有兩個方面的變化,一個是窗口風格的變化,另一個是產品的變化.而且在程序中一般都會出現相同風格的產品,windows風格的應用程序絕對不會出現一個motif風格的按鈕.上面的兩點足以說明,客戶端只需要指定一個風格,然后創建時就自然的創建出這個風格的產品族來了.而每種產品應該有個一致的接口,不會因為風格的不同接口也不同.所以客戶端得到的產品不管是什么風格的都會一致的對待.
            2. 靜態結構圖:

               
              3. 這個模式的好處:
                    增加一個產品,只需增加一個抽象產品類和各個風格的這個產品的具體類.而對別的沒有影響.
                   增加一個風格,首先要增加一個具體工廠類,然后在每個產品中增加一個支持這個風格的具體產品類.
                   松散了client直接創建產品帶來的耦合性,和復雜性(因為直接創建產品將會得到乘積數量的產品).

              4. 什么時候使用:
                  一個系統要獨立于它的產品的創建,組合和使用時.
                  一個系統有一系列產品,而每個產品都有不同的實現(風格),而在一個具體的應用中只能配置一種實現時(風格).

              5. 例子:
                    麥當勞和肯德基都是做快餐的,假如你現在你要做一個這樣的企業的MIS系統,你必  須讓這個系統通用,而且這樣的公司都有一系列的相關產品所以你會考慮用抽象工廠來創建產品系列(象漢堡,可樂等),其中公司就是風格族,做的那些食品就是產品族.而且在一個應用中只有同一個風格的產品出現.不會出現肯德基的瓶子里裝的是麥當勞的可樂.

            下面是示意代碼:

            // Abstract Factory
            class FoodFactory
            {
                
            virtual Homburg* CreateHomburg() = 0;
                
            virtual Kele* CreateKele() = 0;
            }


            // Concrete Factory
            class KFCFactory : public FoodFactory
            {
                Homburg
            * CreateHomburg()
                
            {
                    cout 
            << "use KFC factory create Homburg" << endl;
                    
            return  new KFCHomburg;
                }


                Kele
            * CreateKele()
                
            {
                    cout 
            << "use KFC factory create Kele" << endl;
                    
            return  new KFCKele;
                }

            }


            // Concrete Factory
            class MDLFactory : public FoodFactory
            {
                Homburg
            * CreateHomburg()
                
            {
                    cout 
            << "use MDL factory create Homburg" << endl;
                    
            return  new MDLHomburg;
                }


                Kele
            * CreateKele()
                
            {
                    cout 
            << "use MDL factory create Kele" << endl;
                    
            return  new MDLKele;
                }

            }


            // abstract Homburg
            class Homburg
            {
                
            virtual int  GetFlavour() = 0;
                
            virtual void DrawMe() = 0;
            }


            // Concrete Homburg
            class KFCHomburg : public Homburg
            {
                
            virtual int  GetFlavour()
                
            {
                    cout 
            << "KFC Homburg very good!" << endl;
                    
            return 80;
                }

                
                
            virtual void DrawMe()
                
            {
                    cout 
            << "KFC Homburg drawing" << endl;
                }

            }


            // Concrete Homburg
            class MDLHomburg : public Homburg
            {
                
            virtual int  GetFlavour()
                
            {
                    cout 
            << "MDL Homburg better!" << endl;
                    
            return 90;
                }

                
                
            virtual void DrawMe()
                
            {
                    cout 
            << "MDL Homburg drawing" << endl;
                }

            }


            //Abstract Kele
            class Kele
            {
                
            virtual void AddIce() = 0 ;
                
            virtual DrawMe() = 0;
            }


            // Concrete Kele
            class KFCKele : public Kele
            {
                
            virtual void AddIce()
                
            {
                    cout 
            << "KFC Kele Add Ice" << endl;
                }

                
            virtual DrawMe()
                
            {
                    cout 
            << "KFC Kele drawing" << endl;
                }

            }


            // Concrete Kele
            class MDLKele : public Kele
            {
                
            virtual void AddIce()
                
            {
                    cout 
            << "MDL Kele Add Ice" << endl;
                }

                
            virtual DrawMe()
                
            {
                    cout 
            << "MDL Kele drawing" << endl;
                }

            }


            int main(int argc, char* argv[])
            {
                FoodFactory
            * foodFactory = new  KFCFactory;
                Homburg
            * homb =  foodFactory->CreateHomburg();
                Kele
            *  kele = foodFactory->CreateKele();
                cout 
            << homb->GetFlavour()<< endl; 
                homb
            ->DrawMe();
                kele
            ->AddIce();
                kele
            ->DrawMe();
                
            return 0;
            }

             

               6.相關別的模式:
                    前面說過的工廠方法和抽象工廠的區別是什么,各適用于什么場景中.
                    如果有一系列產品族則用抽象工廠,如果只有一種類型的產品則用工廠方法.


               參考文獻:
                《設計模式精解》清華大學出版社,熊杰譯。
                《設計模式可復用面向對象軟件的基礎》機械工業出版社,四人團著。

            posted on 2009-01-02 04:23 小王 閱讀(350) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式
            99久久成人国产精品免费| 国产精品熟女福利久久AV| 99久久综合国产精品免费| 久久无码中文字幕东京热| 7777精品久久久大香线蕉| 1000部精品久久久久久久久| 大蕉久久伊人中文字幕| 久久精品国产久精国产一老狼| 久久国产AVJUST麻豆| 久久久国产精品福利免费 | 亚洲伊人久久大香线蕉综合图片| 久久久久久久精品妇女99| 一级做a爱片久久毛片| 亚洲精品乱码久久久久久久久久久久| 国产99精品久久| 四虎国产精品成人免费久久| 久久国产精品无码HDAV| 亚洲伊人久久综合中文成人网| 国产V综合V亚洲欧美久久| 精品熟女少妇AV免费久久| 久久国产三级无码一区二区| 国产亚洲精品自在久久| 亚洲午夜无码久久久久| 久久久中文字幕日本| 国产成人精品久久综合| 精品精品国产自在久久高清| 亚洲国产精品无码久久SM| 一级做a爰片久久毛片毛片 | 久久精品国产AV一区二区三区| 久久精品夜色噜噜亚洲A∨| 久久精品麻豆日日躁夜夜躁| 久久精品国产99国产精品导航 | 久久久精品人妻无码专区不卡| 久久精品国产91久久麻豆自制| 久久久久久国产精品无码超碰| 久久99精品久久久大学生| 97精品国产97久久久久久免费| 佐藤遥希在线播放一二区 | 久久精品国产清自在天天线| 女人香蕉久久**毛片精品| 亚洲精品高清国产一久久|