青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 夢在天涯 閱讀(2392) 評論(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

搜索

  •  

積分與排名

  • 積分 - 1814999
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              99在线精品观看| 欧美激情一区二区| 亚洲第一综合天堂另类专| 国产欧美日韩综合一区在线观看 | 亚洲影院高清在线| 国语自产偷拍精品视频偷| 影院欧美亚洲| 亚洲欧洲日韩在线| 欧美主播一区二区三区美女 久久精品人| 久久精品国产成人| 亚洲激情啪啪| 午夜国产一区| 亚洲黄色天堂| 国产精品国内视频| 久久九九精品99国产精品| 亚洲午夜精品在线| 欧美在线www| 91久久久久久久久| 亚洲欧美日韩一区二区三区在线观看| 国产亚洲欧美中文| 99视频+国产日韩欧美| 国产在线精品成人一区二区三区| 久久深夜福利| 欧美三日本三级少妇三99| 久久激情综合网| 欧美视频网站| 另类欧美日韩国产在线| 久久国产福利| 99成人精品| 久久这里只有| 国产精品99久久久久久久久| 日韩视频一区二区在线观看 | 一本色道久久综合一区| 久久精品欧美日韩| 中文精品一区二区三区| 一本大道av伊人久久综合| 最新日韩在线视频| 羞羞色国产精品| 亚洲欧美国产日韩天堂区| 久久久蜜桃一区二区人| 久久精品女人| 国产精品成人在线观看| 欧美大胆人体视频| 久久综合导航| 午夜天堂精品久久久久| 欧美日韩精品免费观看视频| 在线观看中文字幕亚洲| 在线亚洲自拍| 欧美日韩国产精品成人| 久久男人av资源网站| 极品少妇一区二区| 亚洲欧洲在线视频| 亚洲免费激情| 在线播放亚洲| 西西裸体人体做爰大胆久久久| 中文久久精品| 亚洲国产日韩一区| 蜜臀久久久99精品久久久久久 | 在线视频你懂得一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产精品爽黄69| 日韩一区二区精品视频| 一区二区三区福利| 久久综合中文字幕| 免播放器亚洲一区| 亚洲黄一区二区三区| 久久精品国产免费| 欧美激情五月| 亚洲乱码精品一二三四区日韩在线 | 亚洲免费人成在线视频观看| 欧美黑人国产人伦爽爽爽| 亚洲激情一区| 亚洲激情小视频| 欧美日韩美女在线| 亚洲乱码一区二区| 亚洲夫妻自拍| 欧美国产一区二区在线观看| 亚洲高清一区二| 亚洲欧美电影在线观看| 国产精品嫩草影院一区二区| 欧美一区成人| 久久日韩粉嫩一区二区三区| 欧美国产综合| 亚洲美女av电影| 久久久久99精品国产片| 国产综合在线看| 久久躁日日躁aaaaxxxx| 一区二区三区蜜桃网| 欧美亚洲免费高清在线观看| 亚洲欧美激情一区| 亚洲永久免费| 一区二区精品在线观看| 欧美日韩亚洲一区二| 亚洲国产美女| 伊人伊人伊人久久| 午夜精品区一区二区三| 久久久久一区二区| 国产精品一区久久| 亚洲欧美另类在线观看| 久久久精品日韩欧美| 欧美a级在线| 午夜精品久久久久久久男人的天堂| 中文无字幕一区二区三区| 亚洲欧美资源在线| 欧美精品www在线观看| 国产日韩成人精品| 国产日韩欧美视频在线| 国产精品一区二区三区成人| 国产综合久久久久久鬼色| 亚洲黄页视频免费观看| 欧美亚洲三级| 99精品国产高清一区二区 | 91久久精品国产91久久性色tv| 欧美一区二区三区另类| 最新国产精品拍自在线播放| 西西人体一区二区| 夜夜嗨av一区二区三区网页| 亚洲欧洲一区二区天堂久久| 亚洲国产婷婷香蕉久久久久久| 黑人巨大精品欧美一区二区小视频 | 伊人精品成人久久综合软件| 国产精品成人播放| 欧美一级电影久久| 久久全球大尺度高清视频| 亚洲一区日韩| 欧美日韩国产在线看| 亚洲精品视频中文字幕| 亚洲第一在线视频| 黄色小说综合网站| 一区二区三区久久精品| 久久久欧美精品| 99国产精品久久久久久久| 蜜桃av一区| 亚洲无人区一区| 欧美大胆人体视频| 一本一本大道香蕉久在线精品| 亚洲国产精品久久久久婷婷老年| 国产精品毛片a∨一区二区三区|国| 欧美精品色网| 久久亚洲国产精品一区二区| 久久久99免费视频| 欧美国内亚洲| 日韩一区二区福利| 亚洲国产精品一区制服丝袜| 久久国产精品99久久久久久老狼| 国产日韩欧美中文| 国产性猛交xxxx免费看久久| 国产精品极品美女粉嫩高清在线 | 久久se精品一区精品二区| 国产欧美日韩亚洲| 亚洲日本va午夜在线电影 | 久久riav二区三区| 欧美诱惑福利视频| 久久精品国产久精国产爱| 久久久精品动漫| 欧美在线二区| 中文亚洲免费| 欧美一级欧美一级在线播放| 亚洲欧美国产毛片在线| 久久gogo国模裸体人体| 午夜伦理片一区| 久久久久久久波多野高潮日日| 欧美影片第一页| 一本综合久久| 欧美永久精品| 久久精品一区二区三区四区| 欧美一区二区视频观看视频| 亚洲欧美经典视频| 久久天天躁狠狠躁夜夜爽蜜月| 久久久99久久精品女同性| 欧美黄污视频| 欧美日韩在线高清| 欧美女人交a| 国产欧美日韩一区二区三区| 国产性猛交xxxx免费看久久| 亚洲人成人77777线观看| 亚洲美女黄网| 欧美一区二区黄| 老色鬼久久亚洲一区二区| 禁断一区二区三区在线| 99re这里只有精品6| 亚洲视屏一区| 美女精品在线观看| 亚洲韩国精品一区| 午夜精品一区二区三区在线视| 久色成人在线| 99视频精品| 欧美一区二区视频97| 欧美一区二区久久久| 欧美日韩在线一区| 国产亚洲激情在线| 中文在线一区| 久久久xxx| 亚洲视频福利| 欧美一区二区在线免费观看| 欧美日韩精品在线播放| 国产欧美日韩一区二区三区在线| 日韩午夜激情电影| 亚洲自拍电影| 欧美日韩国产一区|