• <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  評(píng)論-37  文章-0  trackbacks-0
            1. 描述:
                   抽象工廠是一個(gè)適用于創(chuàng)建一系列相關(guān)的產(chǎn)品的創(chuàng)建性模型.比如設(shè)計(jì)模式書中經(jīng)常講的那個(gè)例子-支持多視感窗口的工具包,比如windows和motif風(fēng)格,這個(gè)是風(fēng)格族.每種風(fēng)格下面都有些標(biāo)準(zhǔn)的產(chǎn)品族,象BUTTON, TextBox, ListBox等.試想一下,如果直接在client中指定具體產(chǎn)品和它的風(fēng)格,那么會(huì)出現(xiàn)2*3 = 6中組合,如果新增一種產(chǎn)品或風(fēng)格,那么組合會(huì)以倍數(shù)增加,看來(lái)這樣的做法是很愚蠢的.所以還是以面向?qū)ο蟮膸讉€(gè)原則來(lái)分析一下這個(gè)問題,首先可以看出此問題有兩個(gè)方面的變化,一個(gè)是窗口風(fēng)格的變化,另一個(gè)是產(chǎn)品的變化.而且在程序中一般都會(huì)出現(xiàn)相同風(fēng)格的產(chǎn)品,windows風(fēng)格的應(yīng)用程序絕對(duì)不會(huì)出現(xiàn)一個(gè)motif風(fēng)格的按鈕.上面的兩點(diǎn)足以說(shuō)明,客戶端只需要指定一個(gè)風(fēng)格,然后創(chuàng)建時(shí)就自然的創(chuàng)建出這個(gè)風(fēng)格的產(chǎn)品族來(lái)了.而每種產(chǎn)品應(yīng)該有個(gè)一致的接口,不會(huì)因?yàn)轱L(fēng)格的不同接口也不同.所以客戶端得到的產(chǎn)品不管是什么風(fēng)格的都會(huì)一致的對(duì)待.
            2. 靜態(tài)結(jié)構(gòu)圖:

               
              3. 這個(gè)模式的好處:
                    增加一個(gè)產(chǎn)品,只需增加一個(gè)抽象產(chǎn)品類和各個(gè)風(fēng)格的這個(gè)產(chǎn)品的具體類.而對(duì)別的沒有影響.
                   增加一個(gè)風(fēng)格,首先要增加一個(gè)具體工廠類,然后在每個(gè)產(chǎn)品中增加一個(gè)支持這個(gè)風(fēng)格的具體產(chǎn)品類.
                   松散了client直接創(chuàng)建產(chǎn)品帶來(lái)的耦合性,和復(fù)雜性(因?yàn)橹苯觿?chuàng)建產(chǎn)品將會(huì)得到乘積數(shù)量的產(chǎn)品).

              4. 什么時(shí)候使用:
                  一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建,組合和使用時(shí).
                  一個(gè)系統(tǒng)有一系列產(chǎn)品,而每個(gè)產(chǎn)品都有不同的實(shí)現(xiàn)(風(fēng)格),而在一個(gè)具體的應(yīng)用中只能配置一種實(shí)現(xiàn)時(shí)(風(fēng)格).

              5. 例子:
                    麥當(dāng)勞和肯德基都是做快餐的,假如你現(xiàn)在你要做一個(gè)這樣的企業(yè)的MIS系統(tǒng),你必  須讓這個(gè)系統(tǒng)通用,而且這樣的公司都有一系列的相關(guān)產(chǎn)品所以你會(huì)考慮用抽象工廠來(lái)創(chuàng)建產(chǎn)品系列(象漢堡,可樂等),其中公司就是風(fēng)格族,做的那些食品就是產(chǎn)品族.而且在一個(gè)應(yīng)用中只有同一個(gè)風(fēng)格的產(chǎn)品出現(xiàn).不會(huì)出現(xiàn)肯德基的瓶子里裝的是麥當(dāng)勞的可樂.

            下面是示意代碼:

            // 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.相關(guān)別的模式:
                    前面說(shuō)過(guò)的工廠方法和抽象工廠的區(qū)別是什么,各適用于什么場(chǎng)景中.
                    如果有一系列產(chǎn)品族則用抽象工廠,如果只有一種類型的產(chǎn)品則用工廠方法.


               參考文獻(xiàn):
                《設(shè)計(jì)模式精解》清華大學(xué)出版社,熊杰譯。
                《設(shè)計(jì)模式可復(fù)用面向?qū)ο筌浖幕A(chǔ)》機(jī)械工業(yè)出版社,四人團(tuán)著。

            posted on 2009-01-02 04:23 小王 閱讀(350) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式
            久久精品国产亚洲av瑜伽| 色偷偷888欧美精品久久久| 亚洲国产日韩欧美久久| 欧洲性大片xxxxx久久久| 久久无码国产专区精品| 国产精品美女久久久久| 国产精品激情综合久久| 亚洲欧美成人久久综合中文网| 777午夜精品久久av蜜臀| 人人狠狠综合久久亚洲婷婷| 日本精品一区二区久久久| 国产美女亚洲精品久久久综合| 久久香蕉国产线看观看99| 久久婷婷五月综合97色直播| 国产精品久久久久久影院| 久久这里只精品99re66| 国产精品久久久天天影视| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 伊人久久综在合线亚洲2019| 国内精品久久久久久麻豆| 婷婷五月深深久久精品| 亚洲AV伊人久久青青草原| 精品九九久久国内精品| 漂亮人妻被中出中文字幕久久| 久久免费高清视频| 久久精品亚洲日本波多野结衣 | 日韩亚洲欧美久久久www综合网| 国产精品久久久久久| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 亚洲精品WWW久久久久久| 久久久精品免费国产四虎| 久久精品国产精品亚洲毛片| 伊人久久精品影院| 久久精品国产免费观看| 国内精品久久久久影院老司| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 色综合久久久久无码专区| 久久精品亚洲福利| 亚洲精品成人久久久| 亚洲国产高清精品线久久 | 久久香蕉国产线看观看精品yw|