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

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è)類希望由它的子類來指定它所創(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)用程序無關(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)過程包括:

客戶端創(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)行任何修改,也不需要修改客戶端,很好的符合了"開放-封閉"原則。而簡(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è)常見的復(fù)雜邏輯就是循環(huán)使用產(chǎn)品對(duì)象。工廠對(duì)象將已經(jīng)創(chuàng)建過的產(chǎn)品登記到一個(gè)聚集中,然后根據(jù)客戶所請(qǐng)求的產(chǎn)品狀態(tài),向聚集查詢。如果有滿足要求的產(chǎn)品對(duì)象,就直接將產(chǎn)品返回客戶端;如果聚集中沒有這樣的產(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)在天涯 閱讀(2392) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Design pattern

評(píng)論

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

上面代碼開發(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ù)  更多評(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

搜索

  •  

積分與排名

  • 積分 - 1814986
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              国产精品尤物福利片在线观看| 欧美成人69| 亚洲人屁股眼子交8| 欧美v亚洲v综合ⅴ国产v| 日韩视频二区| 午夜精品久久久久久99热| 激情视频亚洲| 99视频精品在线| 一区二区在线视频播放| 亚洲精品视频在线播放| 国产一区二区av| 日韩亚洲在线| 性欧美超级视频| 在线电影国产精品| 亚洲黄一区二区三区| 亚洲影院在线| 久久综合久久久久88| 亚洲欧美视频在线观看| 亚洲国产一区视频| 国产精品一区二区你懂得 | 一区二区三区久久网| 国产一二精品视频| 日韩午夜在线播放| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲一区二区三区四区五区黄| 在线观看日韩精品| 香蕉久久久久久久av网站 | 欧美成人高清视频| 久久久人成影片一区二区三区观看 | 欧美综合77777色婷婷| 亚洲最新在线| 欧美91大片| 久久综合狠狠| 国产一区二区三区无遮挡| 一区二区三区日韩在线观看| 日韩一级黄色片| 欧美α欧美αv大片| 久久综合一区二区| 韩国免费一区| 欧美在线在线| 久久精品国产第一区二区三区最新章节 | 日韩一本二本av| 麻豆成人在线| 麻豆成人av| 伊甸园精品99久久久久久| 欧美一区二区在线播放| 欧美在线视频二区| 国产精品一香蕉国产线看观看 | 在线观看欧美精品| 久久久久久久综合| 美女黄网久久| 亚洲国产三级网| 免费观看成人网| 欧美激情综合| 亚洲毛片在线观看.| 欧美极品aⅴ影院| 亚洲剧情一区二区| 亚洲一区欧美| 国产精品夜夜夜| 香蕉久久夜色精品国产| 久久视频在线看| 尤物精品国产第一福利三区| 日韩午夜激情av| 国产精品久久久久久久久久直播| 日韩特黄影片| 先锋影音国产一区| 国产色视频一区| 久久精品视频网| 99精品国产在热久久| 欧美看片网站| 亚洲一区二区三区精品视频| 久久国产精品久久久久久电车| 韩国成人精品a∨在线观看| 麻豆成人小视频| 一区二区三区高清视频在线观看| 午夜一区不卡| 精品成人在线视频| 欧美精品导航| 午夜精品免费在线| 欧美波霸影院| 亚洲一区www| 精品999在线播放| 欧美日韩不卡视频| 亚洲免费影视| 亚洲第一黄色网| 午夜精品福利在线观看| 尤物视频一区二区| 欧美天天影院| 久久裸体艺术| 一二美女精品欧洲| 免费av成人在线| 亚洲一区二区影院| 在线免费高清一区二区三区| 欧美三级精品| 老司机一区二区三区| 亚洲最新视频在线播放| 美女精品网站| 性欧美1819sex性高清| 亚洲欧洲在线看| 国产日韩欧美中文在线播放| 欧美精品三级| 久久久久网址| 亚洲欧美日韩综合一区| 亚洲日本成人在线观看| 久久综合给合久久狠狠狠97色69| 亚洲一区二区三区中文字幕| 亚洲电影第1页| 国产日韩欧美不卡在线| 欧美日韩免费一区二区三区视频| 久久久久国产免费免费| 亚洲色图在线视频| 亚洲日产国产精品| 欧美激情按摩| 免费国产自线拍一欧美视频| 午夜精品一区二区在线观看| 日韩视频在线观看一区二区| 一区久久精品| 韩日欧美一区二区| 国产婷婷精品| 国产精品素人视频| 欧美性淫爽ww久久久久无| 欧美成人综合网站| 久久一日本道色综合久久| 久久不见久久见免费视频1| 在线视频欧美一区| 夜夜嗨av一区二区三区四季av | 国产精品久久久久久久久借妻| 欧美成人黄色小视频| 欧美中文字幕在线| 午夜精品久久久久久| 亚洲中字在线| 亚洲一级在线| 亚洲综合视频1区| 亚洲男人天堂2024| 亚洲摸下面视频| 欧美日本高清视频| 一色屋精品视频在线观看网站| 国产精品日日做人人爱| 欧美午夜精品理论片a级大开眼界| 欧美久久精品午夜青青大伊人| 欧美福利小视频| 欧美精品日韩综合在线| 欧美欧美午夜aⅴ在线观看| 欧美精品在线观看91| 欧美激情网友自拍| 欧美欧美天天天天操| 欧美日韩精品一本二本三本| 欧美精选在线| 欧美亚韩一区| 国产日产欧美精品| 国内精品亚洲| 亚洲黄色免费| 一区二区三区日韩精品视频| 亚洲综合丁香| 久久九九久久九九| 欧美高清视频| 99精品黄色片免费大全| 亚洲综合色婷婷| 久久亚洲欧洲| 欧美激情精品久久久久久| 欧美三级欧美一级| 国产美女精品一区二区三区| 国外成人性视频| 亚洲国产精品成人| 亚洲视频精选| 久久久久久久久久码影片| 免费视频一区二区三区在线观看| 亚洲高清毛片| 亚洲免费一在线| 毛片一区二区| 国产精品国产三级国产普通话三级| 国产美女精品人人做人人爽| 在线观看一区| 亚洲永久免费观看| 欧美69wwwcom| 亚洲性夜色噜噜噜7777| 久久免费黄色| 欧美性视频网站| 一色屋精品视频免费看| 一本久道久久综合中文字幕| 欧美永久精品| 亚洲视频精品在线| 久久久国产一区二区| 亚洲精品久久7777| 销魂美女一区二区三区视频在线| 久久久www成人免费无遮挡大片 | 久久久久久久综合日本| 亚洲黄色在线看| 欧美一级在线播放| 欧美日韩亚洲91| 在线欧美日韩精品| 欧美一级播放| 亚洲精品少妇网址| 久久久精品日韩欧美| 国产精品高清在线| 日韩午夜在线播放| 另类国产ts人妖高潮视频| 中日韩男男gay无套| 欧美1区免费| 尤物九九久久国产精品的分类|