




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、模式設(shè)計(jì)c#創(chuàng)建型factory method名稱Factory Method結(jié)構(gòu)意圖定義一個(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í)候。
2、0; namespace FactoryMethod_DesignPattern using System; / These two classes could b
3、e part of a framework, / which we will call DP / = class DPDocument &
4、#160; abstract class DPApplication protected DPDocument doc; abstract public void
5、CreateDocument(); public void ConstructObjects() /
6、160;Create objects as needed / . . . / including document &
7、#160; CreateDocument(); abstract public void Dump(); / These two classes
8、60;could be part of an application / = class MyApplication : DPApplication override public void CreateDocument(
9、) doc = new MyDocument();
10、60; override public void Dump() Console.WriteLine("MyApplication
11、160;exists"); class MyDocument : DPDocument / <summary>
12、 / Summary description for Client. / </summary> public class Client public static int Main(string a
13、rgs) MyApplication myApplication = new MyApplication(); myApplication.ConstructObjects();&
14、#160; myApplication.Dump(); return 0;
15、160; 一、 工廠方法(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)的接口,而不接觸
16、哪一個(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與TubeCreato
17、r。抽象產(chǎn)品(Product)角色:工廠方法模式所創(chuàng)建的對(duì)象的超類型,也就是產(chǎn)品對(duì)象的共同父類或共同擁有的接口。在上圖中,這個(gè)角色是Light。具體產(chǎn)品(Concrete Product)角色:這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門(mén)的具體工廠創(chuàng)建,它們之間往往一一對(duì)應(yīng)。3、 程序舉例:using System;public abstract class Light public abstract void TurnOn(); &
18、#160; public abstract void TurnOff();public class BulbLight : Light public override void TurnOn() Console.WriteLine("Bulb Light is Turned on"); public
19、160;override void TurnOff() Console.WriteLine("Bulb Light is Turned off"); public class TubeLight : Light public override void TurnOn() Console.WriteLine(&qu
20、ot;Tube Light is Turned on"); public override void TurnOff() Console.WriteLine("Tube Light is Turned off"); public abstract class Creator
21、60;public abstract Light factory();public class BulbCreator : Creator public override Light factory() return new BulbLight(); public class TubeCreator : Creator
22、60;public override Light factory() return new TubeLight(); public class Client public static void Main() Creator c1 = new BulbCreato
23、r(); Creator c2 = new TubeCreator(); Light l1 = c1.factory(); Light l2 = c2.factory(); l1.TurnOn();
24、; l1.TurnOff(); Console.WriteLine("-"); l2.TurnOn(); l2.TurnOff(); 工廠方法的活動(dòng)序列圖活動(dòng)過(guò)程包括:客戶端創(chuàng)建BulbCreator對(duì)象,客戶端持有此對(duì)象的類型是Creator,而實(shí)際類型是BulbCreator。然后客戶
25、端調(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)單工廠模
26、式在添加新產(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)品登記到
27、一個(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ā)
28、生退化,這時(shí)就不再是工廠模式了。工廠的等級(jí)結(jié)構(gòu):工廠對(duì)象應(yīng)當(dāng)有一個(gè)抽象的超類型。如果等級(jí)結(jié)構(gòu)中只有一個(gè)具體工廠類的話,抽象工廠就可以省略,發(fā)生了退化。六、 Factory Method模式與其它模式的關(guān)系與工廠方法模式有關(guān)的模式還包括:模板方法模式、MVC模式、享元模式、備忘錄模式7、 另外一個(gè)例子/ Factory Method pattern - Real World example using System;using System.Collections
29、;/ "Product"abstract class Page/ "ConcreteProduct"class SkillsPage : Page/ "ConcreteProduct"class EducationPage : Page/ "ConcreteProduct"class ExperiencePage : Page/ "Concrete
30、Product"class IntroductionPage : Page/ "ConcreteProduct"class ResultsPage : Page/ "ConcreteProduct"class ConclusionPage : Page/ "ConcreteProduct"class SummaryPage : Page/ "Concrete
31、Product"class BibliographyPage : Page/ "Creator"abstract class Document / Fields protected ArrayList pages = new ArrayList(); / Constructor public Document()
32、160; this.CreatePages(); / Properties public ArrayList Pages get return pages; / Factory Method abstract publi
33、c void CreatePages();/ "ConcreteCreator"class Resume : Document / Factory Method implementation override public void CreatePages() pages.Add( new SkillsPage(
34、) ); pages.Add( new EducationPage() ); pages.Add( new ExperiencePage() ); / "ConcreteCreator"class Report : Document / Factory Method implementation
35、0; override public void CreatePages() pages.Add( new IntroductionPage() ); pages.Add( new ResultsPage() ); pages.Add( new ConclusionPage() ); pages.Add( new S
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 質(zhì)量管理體系改進(jìn)與案例分析
- 頸動(dòng)脈粥樣硬化影像學(xué)診斷的新進(jìn)展
- 法院檔案查閱管理辦法
- 江蘇特種作業(yè)管理辦法
- 醫(yī)院資金收支管理辦法
- 叉車安全事故心得體會(huì)
- 城區(qū)犬類管理暫行辦法
- 團(tuán)隊(duì)安全培訓(xùn)管理辦法
- 門(mén)式腳手架搭拆技術(shù)與安全管理
- 企業(yè)安全生產(chǎn)條件
- 2023年廣東省高中生物學(xué)業(yè)水平合格性考試試卷真題(含答案詳解)
- 孩子上學(xué)勞動(dòng)合同協(xié)議
- 胎膜早破的護(hù)理查房
- 強(qiáng)奸賠償和解協(xié)議書(shū)
- 【阿里媽媽】2025未來(lái)商業(yè)獎(jiǎng)案例大賞
- Arduino平臺(tái)在循跡避障智能小車設(shè)計(jì)中的應(yīng)用
- 輸血科管理制度、程序性文件、SOP文件
- 稅務(wù)聽(tīng)證申請(qǐng)書(shū)
- 溶瘤病毒工藝開(kāi)發(fā)流程
- 熱工自動(dòng)化知識(shí)培訓(xùn)課件
- 學(xué)查改發(fā)言材料
評(píng)論
0/150
提交評(píng)論