• <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++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

            模式設(shè)計(jì)c#--創(chuàng)建型--factory method

            名稱 Factory Method
            結(jié)構(gòu) o_factory method.bmp
            意圖 定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。Factory Method 使一個(gè)類的實(shí)例化延遲到其子類。
            適用性
            • 當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對(duì)象的類的時(shí)候。
            • 當(dāng)一個(gè)類希望由它的子類來(lái)指定它所創(chuàng)建的對(duì)象的時(shí)候。
            • 當(dāng)類將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類中的某一個(gè),并且你希望將哪一個(gè)幫助子類是代理者這一信息局部化的時(shí)候。
            ?????????
            ???????????????????????????
            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)模式是類的創(chuàng)建模式,其用意是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類中。

            工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使用了多態(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。

            在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個(gè)核心類僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類被實(shí)例化這種細(xì)節(jié)。這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。

            在Factory Method模式中,工廠類與產(chǎn)品類往往具有平行的等級(jí)結(jié)構(gòu),它們之間一一對(duì)應(yīng)。


            二、?Factory Method模式角色與結(jié)構(gòu):

            ?

            抽象工廠(Creator)角色:是工廠方法模式的核心,與應(yīng)用程序無(wú)關(guān)。任何在模式中創(chuàng)建的對(duì)象的工廠類必須實(shí)現(xiàn)這個(gè)接口。

            具體工廠(Concrete Creator)角色:這是實(shí)現(xiàn)抽象工廠接口的具體工廠類,包含與應(yīng)用程序密切相關(guān)的邏輯,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。在上圖中有兩個(gè)這樣的角色:BulbCreator與TubeCreator。

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

            具體產(chǎn)品(Concrete Product)角色:這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門的具體工廠創(chuàng)建,它們之間往往一一對(duì)應(yīng)。


            三、?程序舉例:

            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();
            ???}

            }

            工廠方法的活動(dòng)序列圖

            ?

            活動(dòng)過(guò)程包括:

            客戶端創(chuàng)建BulbCreator對(duì)象,客戶端持有此對(duì)象的類型是Creator,而實(shí)際類型是BulbCreator。然后客戶端調(diào)用BulbCreator的factory方法,之后BulbCreator調(diào)用BulbLight的構(gòu)造函數(shù)創(chuàng)造出產(chǎn)品BulbLight對(duì)象。


            四、?工廠方法模式與簡(jiǎn)單工廠模式

            工廠方法模式與簡(jiǎn)單工廠模式再結(jié)構(gòu)上的不同不是很明顯。工廠方法類的核心是一個(gè)抽象工廠類,而簡(jiǎn)單工廠模式把核心放在一個(gè)具體類上。

            工廠方法模式之所以有一個(gè)別名叫多態(tài)性工廠模式是因?yàn)榫唧w工廠類都有共同的接口,或者有共同的抽象父類。

            當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對(duì)象時(shí),僅僅需要添加一個(gè)具體對(duì)象以及一個(gè)具體工廠對(duì)象,原有工廠對(duì)象不需要進(jìn)行任何修改,也不需要修改客戶端,很好的符合了"開(kāi)放-封閉"原則。而簡(jiǎn)單工廠模式在添加新產(chǎn)品對(duì)象后不得不修改工廠方法,擴(kuò)展性不好。

            工廠方法模式退化后可以演變成簡(jiǎn)單工廠模式。


            五、?Factory Method模式演化

            使用接口或抽象類
            抽象工廠角色和抽象場(chǎng)頻角色都可以選擇由接口或抽象類實(shí)現(xiàn)。

            使用多個(gè)工廠方法
            抽象工廠角色可以規(guī)定出多于一個(gè)的工廠方法,從而使具體工廠角色實(shí)現(xiàn)這些不同的工廠方法,這些方法可以提供不同的商業(yè)邏輯,以滿足提供不同的產(chǎn)品對(duì)象的任務(wù)。

            產(chǎn)品的循環(huán)使用
            工廠方法總是調(diào)用產(chǎn)品類的構(gòu)造函數(shù)以創(chuàng)建一個(gè)新的產(chǎn)品實(shí)例,然后將這個(gè)實(shí)例提供給客戶端。而在實(shí)際情形中,工廠方法所做的事情可以相當(dāng)復(fù)雜。

            一個(gè)常見(jiàn)的復(fù)雜邏輯就是循環(huán)使用產(chǎn)品對(duì)象。工廠對(duì)象將已經(jīng)創(chuàng)建過(guò)的產(chǎn)品登記到一個(gè)聚集中,然后根據(jù)客戶所請(qǐng)求的產(chǎn)品狀態(tài),向聚集查詢。如果有滿足要求的產(chǎn)品對(duì)象,就直接將產(chǎn)品返回客戶端;如果聚集中沒(méi)有這樣的產(chǎn)品對(duì)象,那么就創(chuàng)建一個(gè)新的滿足要求的產(chǎn)品對(duì)象,然后將這個(gè)對(duì)象登記到聚集中,再返還給客戶端。"享元模式(Flyweight Pattern)"就是這樣一個(gè)模式。

            ?

            多態(tài)性的喪失和模式的退化
            一個(gè)工廠方法模式的實(shí)現(xiàn)依賴于工廠角色和產(chǎn)品角色的多態(tài)性。在有些情況下,這個(gè)模式可以出現(xiàn)退化。

            工廠方法返回的類型應(yīng)當(dāng)是抽象類型,而不是具體類型。調(diào)用工廠方法的客戶端應(yīng)當(dāng)依賴抽象產(chǎn)品編程,而不是具體產(chǎn)品。如果工廠僅僅返回一個(gè)具體產(chǎn)品對(duì)象,便違背了工廠方法的用意,發(fā)生退化,這時(shí)就不再是工廠模式了。

            工廠的等級(jí)結(jié)構(gòu):工廠對(duì)象應(yīng)當(dāng)有一個(gè)抽象的超類型。如果等級(jí)結(jié)構(gòu)中只有一個(gè)具體工廠類的話,抽象工廠就可以省略,發(fā)生了退化。


            六、?Factory Method模式與其它模式的關(guān)系

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


            七、?另外一個(gè)例子

            //?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 夢(mèng)在天涯 閱讀(2374) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Design pattern

            評(píng)論

            # re: 模式設(shè)計(jì)c#--創(chuàng)建型--factory method 2006-04-24 08:40 夢(mèng)在天涯

            上面代碼開(kāi)發(fā)過(guò)程中可以如此安排。1)由系統(tǒng)架構(gòu)師設(shè)計(jì)好抽象產(chǎn)品和抽象工廠。2.1)多組并行開(kāi)發(fā)具體產(chǎn)品和具體工廠。2.2)與此同時(shí)另外一組使用依賴注入技術(shù)開(kāi)發(fā)主程序。在1的工作完成后2.1與2.2是可以并行的。按上面方案很可能產(chǎn)生3個(gè)Assembly。最后通過(guò)配置文件完成組裝。


            非常正確。 事實(shí)上,這個(gè)設(shè)計(jì)模式用在組件開(kāi)發(fā)中是非常有用的,而且可以通過(guò)reflect并把具體的類名已經(jīng)產(chǎn)生實(shí)例的參數(shù)傳入工廠來(lái)產(chǎn)生實(shí)例。 java和csharp都是通用的,在這個(gè)點(diǎn)上。  回復(fù)  更多評(píng)論   

            # re: 模式設(shè)計(jì)c#--創(chuàng)建型--factory method 2006-04-24 10:05 夢(mèng)在天涯

            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.

              回復(fù)  更多評(píng)論   

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

            • 隨筆 - 461
            • 文章 - 4
            • 評(píng)論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804430
            • 排名 - 5

            最新評(píng)論

            閱讀排行榜

            久久久国产精华液| 99久久精品国内| 久久免费观看视频| 国产69精品久久久久99| 国产欧美久久久精品| 99热成人精品热久久669| 欧美一区二区三区久久综合| 18岁日韩内射颜射午夜久久成人| 要久久爱在线免费观看| 伊人伊成久久人综合网777| 久久久久这里只有精品| 日日狠狠久久偷偷色综合免费| 久久久WWW成人免费精品| 女同久久| 国色天香久久久久久久小说| 亚洲色欲久久久综合网东京热| 久久久久久国产精品无码下载| 亚洲国产精品一区二区久久hs| 伊人久久无码中文字幕| 久久久亚洲欧洲日产国码aⅴ| 国内精品久久久久影院优 | 久久这里的只有是精品23| 中文字幕亚洲综合久久菠萝蜜| 噜噜噜色噜噜噜久久| 一本久久a久久精品亚洲| 久久婷婷激情综合色综合俺也去 | 久久精品九九亚洲精品| 九九99精品久久久久久| 久久国产成人亚洲精品影院| 久久这里只有精品视频99| 久久精品国产精品亚洲精品| 99久久夜色精品国产网站| 97久久精品午夜一区二区| 久久99精品九九九久久婷婷| 性做久久久久久久久老女人| 五月丁香综合激情六月久久 | 久久99精品久久久久久噜噜| 久久综合一区二区无码| 亚洲精品美女久久777777| 亚洲国产精品久久久久婷婷老年| 久久婷婷人人澡人人|