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

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

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

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

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

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

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


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

?

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

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

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

具體產(chǎn)品(Concrete Product)角色:這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專(zhuān)門(mé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ì)象的類(lèi)型是Creator,而實(shí)際類(lèi)型是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)上的不同不是很明顯。工廠方法類(lèi)的核心是一個(gè)抽象工廠類(lèi),而簡(jiǎn)單工廠模式把核心放在一個(gè)具體類(lèi)上。

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

當(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模式演化

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

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

產(chǎn)品的循環(huán)使用
工廠方法總是調(diào)用產(chǎn)品類(lèi)的構(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)退化。

工廠方法返回的類(lèi)型應(yīng)當(dāng)是抽象類(lèi)型,而不是具體類(lèi)型。調(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è)抽象的超類(lèi)型。如果等級(jí)結(jié)構(gòu)中只有一個(gè)具體工廠類(lèi)的話,抽象工廠就可以省略,發(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)在天涯 閱讀(2386) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): 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并把具體的類(lèi)名已經(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

常用鏈接

隨筆分類(lèi)

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1812156
  • 排名 - 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>
              欧美激情视频一区二区三区不卡| 亚洲影音一区| 欧美成人一区二区三区片免费| 在线观看亚洲精品视频| 欧美激情第五页| 欧美精品黄色| 久久久噜噜噜久久狠狠50岁| 久久美女性网| 亚洲精品国产精品国自产观看浪潮 | 久久蜜桃精品| 亚洲美女诱惑| 亚洲一区视频在线观看视频| 国产亚洲欧美aaaa| 欧美国产欧美亚洲国产日韩mv天天看完整| 你懂的成人av| 新片速递亚洲合集欧美合集| 久久久噜噜噜久久中文字幕色伊伊| 亚洲人成在线播放| 亚洲在线观看免费| 亚洲国产午夜| 亚洲一二三区视频在线观看| 亚洲第一网站免费视频| 中日韩美女免费视频网站在线观看| 国产一二精品视频| 亚洲美女av在线播放| 国内自拍视频一区二区三区| 亚洲人成网在线播放| 国产亚洲福利| 99这里只有精品| 亚洲国产精品黑人久久久| 亚洲视频一区二区在线观看| 亚洲国产成人一区| 欧美在线视频全部完| 亚洲视频你懂的| 久久综合色播五月| 欧美亚洲综合网| 欧美日韩视频在线第一区| 美女999久久久精品视频| 国产精品成人久久久久| 亚洲黄色av一区| 伊人成年综合电影网| 亚洲欧美日韩国产中文| 亚洲视频观看| 欧美日韩国产丝袜另类| 亚洲福利电影| 亚洲成人自拍视频| 久久国产视频网站| 久久精品理论片| 国产精品伦一区| 一区二区三区高清在线| 99精品福利视频| 欧美黑人在线播放| 亚洲风情亚aⅴ在线发布| 136国产福利精品导航网址| 欧美一级午夜免费电影| 欧美在线观看视频| 国产噜噜噜噜噜久久久久久久久| 99精品欧美一区二区三区| 99在线热播精品免费| 欧美日韩精品三区| 日韩亚洲欧美中文三级| 亚洲最新视频在线| 欧美日韩中文字幕综合视频 | 欧美一区二区三区婷婷月色 | 国产午夜精品理论片a级大结局 | 香蕉成人伊视频在线观看| 亚洲天堂男人| 国产精品都在这里| 亚洲一区二区视频| 欧美在线黄色| 狠狠干综合网| 久久天天躁狠狠躁夜夜爽蜜月| 美女图片一区二区| 亚洲人成网站在线播| 欧美日韩精品伦理作品在线免费观看 | 最新中文字幕一区二区三区| 麻豆成人av| 亚洲开发第一视频在线播放| 亚洲午夜免费视频| 国产伦精品一区二区三区视频孕妇 | 久久精品日韩一区二区三区| 狠狠色香婷婷久久亚洲精品| 裸体丰满少妇做受久久99精品| 亚洲福利视频三区| 亚洲一区国产精品| 国产亚洲成av人在线观看导航 | 国产精品一区久久久久| 欧美中文字幕在线视频| 亚洲国产精品免费| 亚洲欧美一区二区视频| 黄色一区二区在线| 欧美日韩精品一本二本三本| 亚洲欧美国产制服动漫| 欧美成人资源| 亚洲欧美一区二区三区久久| 在线成人性视频| 欧美日韩亚洲一区在线观看| 久久成人免费电影| 亚洲精品视频在线观看网站| 久久久www成人免费无遮挡大片 | 亚洲一区二区三区精品视频| 激情综合网址| 欧美性猛交一区二区三区精品| 欧美在线免费观看视频| 99成人精品| 蜜月aⅴ免费一区二区三区| 亚洲一区二区三区免费观看| 在线成人激情黄色| 国产精品亚发布| 欧美理论电影在线观看| 久久久久天天天天| 午夜电影亚洲| aaa亚洲精品一二三区| 老鸭窝毛片一区二区三区| 亚洲欧美日韩中文视频| 亚洲精品社区| 亚洲国产精品999| 国产视频在线观看一区二区三区| 欧美日韩一区综合| 欧美精品激情| 欧美成人a视频| 久久影院亚洲| 久久国产精品久久久久久| 亚洲一区免费视频| 一区二区三区视频在线观看| 亚洲激情婷婷| 黄色成人在线免费| 欧美精品一区三区| 麻豆精品传媒视频| 欧美综合国产| 欧美一区二区三区在线观看| 亚洲一区二区三区国产| 日韩一级片网址| 日韩视频一区二区在线观看| 亚洲人www| 亚洲人屁股眼子交8| 91久久精品国产91久久| 欧美成人午夜视频| 欧美第一黄网免费网站| 欧美国产日韩a欧美在线观看| 久久亚洲一区二区三区四区| 久久手机免费观看| 免费在线日韩av| 久久天天躁夜夜躁狠狠躁2022| 久久久久久午夜| 葵司免费一区二区三区四区五区| 久久综合伊人| 亚洲大胆女人| 亚洲精品国产精品国产自| 亚洲日本在线观看| 夜夜狂射影院欧美极品| 亚洲综合不卡| 久久精品国产99精品国产亚洲性色 | 欧美大片在线观看一区| 亚洲国产精品福利| 99v久久综合狠狠综合久久| 亚洲视频每日更新| 欧美在线观看视频| 免费成人av在线看| 欧美午夜视频一区二区| 国产日韩欧美在线播放不卡| 国产一区二区三区在线观看免费视频 | 日韩视频永久免费观看| 亚洲网站在线看| 久久久99免费视频| 欧美巨乳波霸| 国产日韩精品电影| 亚洲国产网站| 亚洲欧美日韩精品久久| 美国成人直播| 一区二区日本视频| 欧美在线视频不卡| 欧美日韩天天操| 黄色国产精品| 亚洲一区二区三区在线看| 乱中年女人伦av一区二区| 亚洲三级免费观看| 久久精品成人| 欧美日韩在线视频首页| 国内精品伊人久久久久av影院| 亚洲国产精品久久久久秋霞影院| 亚洲尤物在线视频观看| 免费一级欧美片在线播放| 一区二区三区四区国产| 久久在线免费观看| 国产精品久久久免费| 亚洲欧洲精品一区二区三区| 久久精品道一区二区三区| 亚洲精品国产品国语在线app| 久久精品国产免费| 国产精品中文字幕在线观看| 亚洲伦理中文字幕| 久久一区国产| 亚洲欧美一区二区精品久久久| 欧美经典一区二区三区| 亚洲国产日韩欧美在线99 | 欧美自拍丝袜亚洲| 亚洲精品久久久蜜桃| 久久在线免费| 亚洲精品在线免费观看视频|