C#設(shè)計(jì)模式工廠(chǎng)型設(shè)計(jì)示例
《C#設(shè)計(jì)模式工廠(chǎng)型設(shè)計(jì)示例》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《C#設(shè)計(jì)模式工廠(chǎng)型設(shè)計(jì)示例(10頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
模式設(shè)計(jì) c 創(chuàng)建型 factory method 名 稱(chēng) Factory Method 結(jié) 構(gòu) 意 圖 定義一個(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 description for Client public class Client public static int Main string args MyApplication myApplication new MyApplication myApplication ConstructObjects myApplication Dump return 0 一 工廠(chǎng)方法 Factory Method 模式 工廠(chǎng)方法 FactoryMethod 模式是類(lèi)的創(chuàng)建模式 其用意是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠(chǎng)接 口 將實(shí)際創(chuàng)建工作推遲到子類(lèi)中 工廠(chǎng)方法模式是簡(jiǎn)單工廠(chǎng)模式的進(jìn)一步抽象和推廣 由于使用了多態(tài)性 工廠(chǎng)方法模式保持了 簡(jiǎn)單工廠(chǎng)模式的優(yōu)點(diǎn) 而且克服了它的缺點(diǎn) 在工廠(chǎng)方法模式中 核心的工廠(chǎng)類(lèi)不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建 而是將具體創(chuàng)建工作交給子類(lèi)去 做 這個(gè)核心類(lèi)僅僅負(fù)責(zé)給出具體工廠(chǎng)必須實(shí)現(xiàn)的接口 而不接觸哪一個(gè)產(chǎn)品類(lèi)被實(shí)例化這種 細(xì)節(jié) 這使得工廠(chǎng)方法模式可以允許系統(tǒng)在不修改工廠(chǎng)角色的情況下引進(jìn)新產(chǎn)品 在 Factory Method 模式中 工廠(chǎng)類(lèi)與產(chǎn)品類(lèi)往往具有平行的等級(jí)結(jié)構(gòu) 它們之間一一對(duì)應(yīng) 二 Factory Method 模式角色與結(jié)構(gòu) 抽象工廠(chǎng) Creator 角色 是工廠(chǎng)方法模式的核心 與應(yīng)用程序無(wú)關(guān) 任何在模式中創(chuàng)建的 對(duì)象的工廠(chǎng)類(lèi)必須實(shí)現(xiàn)這個(gè)接口 具體工廠(chǎng) Concrete Creator 角色 這是實(shí)現(xiàn)抽象工廠(chǎng)接口的具體工廠(chǎng)類(lèi) 包含與應(yīng)用程 序密切相關(guān)的邏輯 并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對(duì)象 在上圖中有兩個(gè)這樣的角色 BulbCreator 與 TubeCreator 抽象產(chǎn)品 Product 角色 工廠(chǎng)方法模式所創(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)的具體工廠(chǎng)創(chuàng)建 它們之間往往一一對(duì)應(yīng) 3 程序舉例 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 工廠(chǎng)方法的活動(dòng)序列圖 活動(dòng)過(guò)程包括 客戶(hù)端創(chuàng)建 BulbCreator 對(duì)象 客戶(hù)端持有此對(duì)象的類(lèi)型是 Creator 而實(shí)際類(lèi)型是 BulbCreator 然后客戶(hù)端調(diào)用 BulbCreator 的 factory 方法 之后 BulbCreator 調(diào)用 BulbLight 的構(gòu)造函數(shù)創(chuàng)造出產(chǎn)品 BulbLight 對(duì)象 四 工廠(chǎng)方法模式與簡(jiǎn)單工廠(chǎng)模式 工廠(chǎng)方法模式與簡(jiǎn)單工廠(chǎng)模式再結(jié)構(gòu)上的不同不是很明顯 工廠(chǎng)方法類(lèi)的核心是一個(gè)抽象工廠(chǎng) 類(lèi) 而簡(jiǎn)單工廠(chǎng)模式把核心放在一個(gè)具體類(lèi)上 工廠(chǎng)方法模式之所以有一個(gè)別名叫多態(tài)性工廠(chǎng)模式是因?yàn)榫唧w工廠(chǎng)類(lèi)都有共同的接口 或者有 共同的抽象父類(lèi) 當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對(duì)象時(shí) 僅僅需要添加一個(gè)具體對(duì)象以及一個(gè)具體工廠(chǎng)對(duì)象 原 有工廠(chǎng)對(duì)象不需要進(jìn)行任何修改 也不需要修改客戶(hù)端 很好的符合了 開(kāi)放 封閉 原則 而 簡(jiǎn)單工廠(chǎng)模式在添加新產(chǎn)品對(duì)象后不得不修改工廠(chǎng)方法 擴(kuò)展性不好 工廠(chǎng)方法模式退化后可以演變成簡(jiǎn)單工廠(chǎng)模式 五 Factory Method 模式演化 使用接口或抽象類(lèi) 抽象工廠(chǎng)角色和抽象場(chǎng)頻角色都可以選擇由接口或抽象類(lèi)實(shí)現(xiàn) 使用多個(gè)工廠(chǎng)方法 抽象工廠(chǎng)角色可以規(guī)定出多于一個(gè)的工廠(chǎng)方法 從而使具體工廠(chǎng)角色實(shí)現(xiàn)這些不同的工廠(chǎng)方法 這些方法可以提供不同的商業(yè)邏輯 以滿(mǎn)足提供不同的產(chǎn)品對(duì)象的任務(wù) 產(chǎn)品的循環(huán)使用 工廠(chǎng)方法總是調(diào)用產(chǎn)品類(lèi)的構(gòu)造函數(shù)以創(chuàng)建一個(gè)新的產(chǎn)品實(shí)例 然后將這個(gè)實(shí)例提供給客戶(hù)端 而在實(shí)際情形中 工廠(chǎng)方法所做的事情可以相當(dāng)復(fù)雜 一個(gè)常見(jiàn)的復(fù)雜邏輯就是循環(huán)使用產(chǎn)品對(duì)象 工廠(chǎng)對(duì)象將已經(jīng)創(chuàng)建過(guò)的產(chǎn)品登記到一個(gè)聚集中 然后根據(jù)客戶(hù)所請(qǐng)求的產(chǎn)品狀態(tài) 向聚集查詢(xún) 如果有滿(mǎn)足要求的產(chǎn)品對(duì)象 就直接將產(chǎn)品返 回客戶(hù)端 如果聚集中沒(méi)有這樣的產(chǎn)品對(duì)象 那么就創(chuàng)建一個(gè)新的滿(mǎn)足要求的產(chǎn)品對(duì)象 然后 將這個(gè)對(duì)象登記到聚集中 再返還給客戶(hù)端 享元模式 Flyweight Pattern 就是這樣一 個(gè)模式 多態(tài)性的喪失和模式的退化 一個(gè)工廠(chǎng)方法模式的實(shí)現(xiàn)依賴(lài)于工廠(chǎng)角色和產(chǎn)品角色的多態(tài)性 在有些情況下 這個(gè)模式可以 出現(xiàn)退化 工廠(chǎng)方法返回的類(lèi)型應(yīng)當(dāng)是抽象類(lèi)型 而不是具體類(lèi)型 調(diào)用工廠(chǎng)方法的客戶(hù)端應(yīng)當(dāng)依賴(lài)抽象 產(chǎn)品編程 而不是具體產(chǎn)品 如果工廠(chǎng)僅僅返回一個(gè)具體產(chǎn)品對(duì)象 便違背了工廠(chǎng)方法的用意 發(fā)生退化 這時(shí)就不再是工廠(chǎng)模式了 工廠(chǎng)的等級(jí)結(jié)構(gòu) 工廠(chǎng)對(duì)象應(yīng)當(dāng)有一個(gè)抽象的超類(lèi)型 如果等級(jí)結(jié)構(gòu)中只有一個(gè)具體工廠(chǎng)類(lèi)的 話(huà) 抽象工廠(chǎng)就可以省略 發(fā)生了退化 六 Factory Method 模式與其它模式的關(guān)系 與工廠(chǎng)方法模式有關(guān)的模式還包括 模板方法模式 MVC 模式 享元模式 備忘錄模式 7 另外一個(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 FactoryMethodApp test 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- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
15 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- C# 設(shè)計(jì) 模式 工廠(chǎng) 示例
鏈接地址:http://www.820124.com/p-10591794.html