• <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>

            C++ Programmer's Cookbook

            {C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            模式設計c#--創建型--factory method

            名稱 Factory Method
            結構 o_factory method.bmp
            意圖 定義一個用于創建對象的接口,讓子類決定實例化哪一個類。Factory Method 使一個類的實例化延遲到其子類。
            適用性
            • 當一個類不知道它所必須創建的對象的類的時候。
            • 當一個類希望由它的子類來指定它所創建的對象的時候。
            • 當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
            ?????????
            ???????????????????????????
            namespace?FactoryMethod_DesignPattern
            {
            ????
            using?System;

            ????
            //?These?two?classes?could?be?part?of?a?framework,
            ????
            //?which?we?will?call?DP
            ????
            //?===============================================
            ????
            ????
            class?DPDocument?
            ????
            {
            ????

            ????}


            ????
            abstract?class?DPApplication?
            ????
            {
            ????????
            protected?DPDocument?doc;
            ????????
            ????????
            abstract?public?void?CreateDocument();

            ????????
            public?void?ConstructObjects()
            ????????
            {
            ????????????
            ????????????
            //?Create?objects?as?needed
            ????????????
            //?.?.?.

            ????????????
            //?including?document
            ????????????CreateDocument();
            ????????}
            ????????
            ????????
            abstract?public?void?Dump();
            ????}


            ????
            //?These?two?classes?could?be?part?of?an?application?
            ????
            //?=================================================

            ????
            class?MyApplication?:?DPApplication?
            ????
            {
            ????????
            override?public?void?CreateDocument()
            ????????
            {
            ????????????doc?
            =?new?MyDocument();????????????
            ????????}
            ????????????

            ????????
            override?public?void?Dump()
            ????????
            {
            ????????????Console.WriteLine(
            "MyApplication?exists");
            ????????}

            ????}
            ????

            ????
            class?MyDocument?:?DPDocument?
            ????
            {

            ????}


            ????
            ///?<summary>
            ????
            ///????Summary?description?for?Client.
            ????
            ///?</summary>

            ????public?class?Client
            ????
            {
            ????????
            public?static?int?Main(string[]?args)
            ????????
            {
            ????????????MyApplication?myApplication?
            =?new?MyApplication();

            ????????????myApplication.ConstructObjects();

            ????????????myApplication.Dump();
            ????????????
            ????????????
            return?0;
            ????????}

            ????}

            }


            ?????????http://zhenyulu.cnblogs.com/articles/36590.html

            一、?工廠方法(Factory Method)模式

            工廠方法(FactoryMethod)模式是類的創建模式,其用意是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類中。

            工廠方法模式是簡單工廠模式的進一步抽象和推廣。由于使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。

            在工廠方法模式中,核心的工廠類不再負責所有產品的創建,而是將具體創建工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的接口,而不接觸哪一個產品類被實例化這種細節。這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。

            在Factory Method模式中,工廠類與產品類往往具有平行的等級結構,它們之間一一對應。


            二、?Factory Method模式角色與結構:

            ?

            抽象工廠(Creator)角色:是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。

            具體工廠(Concrete Creator)角色:這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,并且受到應用程序調用以創建產品對象。在上圖中有兩個這樣的角色:BulbCreator與TubeCreator。

            抽象產品(Product)角色:工廠方法模式所創建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。在上圖中,這個角色是Light。

            具體產品(Concrete Product)角色:這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,它們之間往往一一對應。


            三、?程序舉例:

            using?System;

            public?abstract???class?Light
            {
            ???
            public?abstract?void?TurnOn();
            ???
            public?abstract?void?TurnOff();
            }


            public?class?BulbLight?:?Light
            {
            ???
            public?override?void?TurnOn()
            ???
            {?Console.WriteLine("Bulb?Light?is?Turned?on");?}

            ???
            public?override?void?TurnOff()
            ???
            {?Console.WriteLine("Bulb?Light?is?Turned?off");?}
            }


            public?class?TubeLight?:?Light
            {
            ???
            public?override?void?TurnOn()
            ???
            {?Console.WriteLine("Tube?Light?is?Turned?on");?}

            ???
            public?override?void?TurnOff()
            ???
            {?Console.WriteLine("Tube?Light?is?Turned?off");?}
            }


            public?abstract???class?Creator
            {
            ???
            public?abstract?Light?factory();
            }


            public?class?BulbCreator?:?Creator
            {
            ???
            public?override?Light?factory()
            ???
            {?return?new?BulbLight();?}
            }


            public?class?TubeCreator?:?Creator
            {
            ???
            public?override?Light?factory()
            ???
            {?return?new?TubeLight();?}
            }


            public?class?Client
            {
            ???
            public?static?void?Main()
            ???
            {
            ??????Creator?c1?
            =?new?BulbCreator();
            ??????Creator?c2?
            =?new?TubeCreator();

            ??????Light?l1?
            =?c1.factory();
            ??????Light?l2?
            =?c2.factory();

            ??????l1.TurnOn();
            ??????l1.TurnOff();

            ??????Console.WriteLine(
            "-----------------");

            ??????l2.TurnOn();
            ??????l2.TurnOff();
            ???}

            }

            工廠方法的活動序列圖

            ?

            活動過程包括:

            客戶端創建BulbCreator對象,客戶端持有此對象的類型是Creator,而實際類型是BulbCreator。然后客戶端調用BulbCreator的factory方法,之后BulbCreator調用BulbLight的構造函數創造出產品BulbLight對象。


            四、?工廠方法模式與簡單工廠模式

            工廠方法模式與簡單工廠模式再結構上的不同不是很明顯。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。

            工廠方法模式之所以有一個別名叫多態性工廠模式是因為具體工廠類都有共同的接口,或者有共同的抽象父類。

            當系統擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好的符合了"開放-封閉"原則。而簡單工廠模式在添加新產品對象后不得不修改工廠方法,擴展性不好。

            工廠方法模式退化后可以演變成簡單工廠模式。


            五、?Factory Method模式演化

            使用接口或抽象類
            抽象工廠角色和抽象場頻角色都可以選擇由接口或抽象類實現。

            使用多個工廠方法
            抽象工廠角色可以規定出多于一個的工廠方法,從而使具體工廠角色實現這些不同的工廠方法,這些方法可以提供不同的商業邏輯,以滿足提供不同的產品對象的任務。

            產品的循環使用
            工廠方法總是調用產品類的構造函數以創建一個新的產品實例,然后將這個實例提供給客戶端。而在實際情形中,工廠方法所做的事情可以相當復雜。

            一個常見的復雜邏輯就是循環使用產品對象。工廠對象將已經創建過的產品登記到一個聚集中,然后根據客戶所請求的產品狀態,向聚集查詢。如果有滿足要求的產品對象,就直接將產品返回客戶端;如果聚集中沒有這樣的產品對象,那么就創建一個新的滿足要求的產品對象,然后將這個對象登記到聚集中,再返還給客戶端。"享元模式(Flyweight Pattern)"就是這樣一個模式。

            ?

            多態性的喪失和模式的退化
            一個工廠方法模式的實現依賴于工廠角色和產品角色的多態性。在有些情況下,這個模式可以出現退化。

            工廠方法返回的類型應當是抽象類型,而不是具體類型。調用工廠方法的客戶端應當依賴抽象產品編程,而不是具體產品。如果工廠僅僅返回一個具體產品對象,便違背了工廠方法的用意,發生退化,這時就不再是工廠模式了。

            工廠的等級結構:工廠對象應當有一個抽象的超類型。如果等級結構中只有一個具體工廠類的話,抽象工廠就可以省略,發生了退化。


            六、?Factory Method模式與其它模式的關系

            與工廠方法模式有關的模式還包括:
            模板方法模式、MVC模式、享元模式、備忘錄模式


            七、?另外一個例子

            //?Factory?Method?pattern?--?Real?World?example??

            using?System;
            using?System.Collections;

            //?"Product"
            abstract?class?Page
            {
            }


            //?"ConcreteProduct"
            class?SkillsPage?:?Page
            {
            }


            //?"ConcreteProduct"
            class?EducationPage?:?Page
            {
            }


            //?"ConcreteProduct"
            class?ExperiencePage?:?Page
            {
            }


            //?"ConcreteProduct"
            class?IntroductionPage?:?Page
            {
            }


            //?"ConcreteProduct"
            class?ResultsPage?:?Page
            {
            }


            //?"ConcreteProduct"
            class?ConclusionPage?:?Page
            {
            }


            //?"ConcreteProduct"
            class?SummaryPage?:?Page
            {
            }


            //?"ConcreteProduct"
            class?BibliographyPage?:?Page
            {
            }


            //?"Creator"
            abstract?class?Document
            {
            ??
            //?Fields
            ???protected?ArrayList?pages?=?new?ArrayList();

            ??
            //?Constructor
            ???public?Document()
            ??
            {
            ????
            this.CreatePages();
            ??}


            ??
            //?Properties
            ???public?ArrayList?Pages
            ??
            {
            ????
            get{?return?pages;?}
            ??}


            ??
            //?Factory?Method
            ???abstract?public?void?CreatePages();
            }


            //?"ConcreteCreator"
            class?Resume?:?Document
            {
            ??
            //?Factory?Method?implementation
            ???override?public?void?CreatePages()
            ??
            {
            ????pages.Add(?
            new?SkillsPage()?);
            ????pages.Add(?
            new?EducationPage()?);
            ????pages.Add(?
            new?ExperiencePage()?);
            ??}

            }


            //?"ConcreteCreator"
            class?Report?:?Document
            {
            ??
            //?Factory?Method?implementation
            ???override?public?void?CreatePages()
            ??
            {
            ????pages.Add(?
            new?IntroductionPage()?);
            ????pages.Add(?
            new?ResultsPage()?);
            ????pages.Add(?
            new?ConclusionPage()?);
            ????pages.Add(?
            new?SummaryPage()?);
            ????pages.Add(?
            new?BibliographyPage()?);
            ??}

            }


            ///?<summary>
            ///??FactoryMethodApp?test
            ///?</summary>

            class?FactoryMethodApp
            {
            ??
            public?static?void?Main(?string[]?args?)
            ??
            {
            ????Document[]?docs?
            =?new?Document[?2?];

            ????
            //?Note:?constructors?call?Factory?Method
            ????docs[0]?=?new?Resume();
            ????docs[
            1]?=?new?Report();

            ????
            //?Display?document?pages
            ?????foreach(?Document?document?in?docs?)
            ????
            {
            ??????Console.WriteLine(?
            ""?+?document?+?"?-------?"?);
            ??????
            foreach(?Page?page?in?document.Pages?)
            ????????Console.WriteLine(?
            "?"?+?page?);
            ????}

            ??}

            }

            posted on 2006-01-03 14:28 夢在天涯 閱讀(2373) 評論(2)  編輯 收藏 引用 所屬分類: Design pattern

            評論

            # re: 模式設計c#--創建型--factory method 2006-04-24 08:40 夢在天涯

            上面代碼開發過程中可以如此安排。1)由系統架構師設計好抽象產品和抽象工廠。2.1)多組并行開發具體產品和具體工廠。2.2)與此同時另外一組使用依賴注入技術開發主程序。在1的工作完成后2.1與2.2是可以并行的。按上面方案很可能產生3個Assembly。最后通過配置文件完成組裝。


            非常正確。 事實上,這個設計模式用在組件開發中是非常有用的,而且可以通過reflect并把具體的類名已經產生實例的參數傳入工廠來產生實例。 java和csharp都是通用的,在這個點上。  回復  更多評論   

            # re: 模式設計c#--創建型--factory method 2006-04-24 10:05 夢在天涯

            definition
            Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

              回復  更多評論   

            公告

            EMail:itech001#126.com

            導航

            統計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804314
            • 排名 - 5

            最新評論

            閱讀排行榜

            精品乱码久久久久久夜夜嗨 | 色诱久久久久综合网ywww| 久久AV无码精品人妻糸列| 国产精品久久波多野结衣| 国产精品内射久久久久欢欢| 囯产极品美女高潮无套久久久 | 久久精品视频91| 久久永久免费人妻精品下载| 精品99久久aaa一级毛片| 一本色道久久88—综合亚洲精品 | 性欧美大战久久久久久久久| 精品久久国产一区二区三区香蕉| 久久精品卫校国产小美女| 99久久免费国产精品| 国产午夜福利精品久久2021 | 久久久久久久97| 久久综合色之久久综合| 丰满少妇高潮惨叫久久久| 久久久久久国产a免费观看黄色大片| 色综合久久精品中文字幕首页| 久久久国产99久久国产一| 久久久久香蕉视频| 91精品国产高清久久久久久国产嫩草 | 久久国产精品久久| 久久亚洲春色中文字幕久久久 | 国产成人久久激情91| 久久午夜羞羞影院免费观看| 亚洲国产视频久久| 一本色道久久88综合日韩精品 | 久久久久国产精品嫩草影院| 国产真实乱对白精彩久久| 色综合久久中文综合网| 久久国产色AV免费观看| 久久精品中文无码资源站| 精品国产VA久久久久久久冰| 亚洲精品无码久久久久久| 亚洲精品乱码久久久久久久久久久久| 综合久久精品色| 午夜欧美精品久久久久久久| 久久香蕉国产线看观看精品yw| 久久精品www人人爽人人|