• <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++ 高級} {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)建對象的接口,讓子類決定實(shí)例化哪一個(gè)類。Factory Method 使一個(gè)類的實(shí)例化延遲到其子類。
            適用性
            • 當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對象的類的時(shí)候。
            • 當(dāng)一個(gè)類希望由它的子類來指定它所創(chuàng)建的對象的時(shí)候。
            • 當(dāng)類將創(chuàng)建對象的職責(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)品對象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類中。

            工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。由于使用了多態(tài)性,工廠方法模式保持了簡單工廠模式的優(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)品類往往具有平行的等級結(jié)構(gòu),它們之間一一對應(yīng)。


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

            ?

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

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

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

            具體產(chǎn)品(Concrete Product)角色:這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門的具體工廠創(chuàng)建,它們之間往往一一對應(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();
            ???}

            }

            工廠方法的活動序列圖

            ?

            活動過程包括:

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


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

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

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

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

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


            五、?Factory Method模式演化

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

            使用多個(gè)工廠方法
            抽象工廠角色可以規(guī)定出多于一個(gè)的工廠方法,從而使具體工廠角色實(shí)現(xiàn)這些不同的工廠方法,這些方法可以提供不同的商業(yè)邏輯,以滿足提供不同的產(chǎn)品對象的任務(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è)常見的復(fù)雜邏輯就是循環(huán)使用產(chǎn)品對象。工廠對象將已經(jīng)創(chuàng)建過的產(chǎn)品登記到一個(gè)聚集中,然后根據(jù)客戶所請求的產(chǎn)品狀態(tài),向聚集查詢。如果有滿足要求的產(chǎn)品對象,就直接將產(chǎn)品返回客戶端;如果聚集中沒有這樣的產(chǎn)品對象,那么就創(chuàng)建一個(gè)新的滿足要求的產(chǎn)品對象,然后將這個(gè)對象登記到聚集中,再返還給客戶端。"享元模式(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)品對象,便違背了工廠方法的用意,發(fā)生退化,這時(shí)就不再是工廠模式了。

            工廠的等級結(jié)構(gòu):工廠對象應(yīng)當(dāng)有一個(gè)抽象的超類型。如果等級結(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 夢在天涯 閱讀(2372) 評論(2)  編輯 收藏 引用 所屬分類: Design pattern

            評論

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

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


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

            # re: 模式設(shè)計(jì)c#--創(chuàng)建型--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.

              回復(fù)  更多評論   

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

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

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804159
            • 排名 - 5

            最新評論

            閱讀排行榜

            久久久久亚洲av无码专区| 久久久久噜噜噜亚洲熟女综合| 久久综合香蕉国产蜜臀AV| 久久久免费精品re6| 91性高湖久久久久| 久久午夜福利无码1000合集| 久久香蕉超碰97国产精品| www亚洲欲色成人久久精品| 亚洲美日韩Av中文字幕无码久久久妻妇 | 无码人妻久久一区二区三区| 丰满少妇人妻久久久久久| 久久久精品视频免费观看| 久久婷婷人人澡人人爽人人爱| 丰满少妇人妻久久久久久| 久久一区二区免费播放| 久久精品中文字幕无码绿巨人| 久久久久久国产精品无码下载| 色综合久久久久无码专区| 国产亚洲美女精品久久久| 午夜久久久久久禁播电影| 久久99精品久久久久久野外| 久久99国产精品尤物| 青青久久精品国产免费看 | 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲伊人久久精品影院 | 婷婷久久综合| 亚洲人成伊人成综合网久久久| 狠狠综合久久综合中文88 | 国内精品久久久人妻中文字幕| 国产精品无码久久四虎| 国产精品无码久久综合| 久久91精品国产91| 久久久久无码中| 亚洲一区中文字幕久久| 国产综合久久久久| 亚洲精品白浆高清久久久久久| 日韩va亚洲va欧美va久久| 国产成人精品久久亚洲高清不卡 | 久久香蕉国产线看观看精品yw| 久久只有这精品99| 日产久久强奸免费的看|