由淺入深學(xué)“工廠模式”_第1頁(yè)
由淺入深學(xué)“工廠模式”_第2頁(yè)
由淺入深學(xué)“工廠模式”_第3頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、由淺入深學(xué)“工廠模式” (1)2007-03-25 17:131、傳授設(shè)計(jì)模式中存在的問(wèn)題我個(gè)人最近對(duì)設(shè)計(jì)模式中的工廠模式進(jìn)行了比較深入的學(xué)習(xí), 通過(guò)學(xué)習(xí)感悟 出,現(xiàn)在很多設(shè)計(jì)模式傳道者, 在講述設(shè)計(jì)模式的過(guò)程中存在一些問(wèn)題, 使得設(shè) 計(jì)模式變得很難理解。設(shè)計(jì)模式本身很抽象,但是這些傳道者在講述的過(guò)程中, 將一個(gè)抽象的東西講的更抽象, 從而使我們望而卻步。 有些人在講述的時(shí)候, 沒(méi) 有考慮讀者的注意力。比如我在看 C# 設(shè)計(jì)模式的時(shí)候,在講述抽象工廠模 式的時(shí)候, 直接就進(jìn)入了一個(gè)示例, 而且這個(gè)例子比較復(fù)雜, 涉及了比較多的概 念、術(shù)語(yǔ),而且還有算法要處理。但是這些和要講述的核心內(nèi)容無(wú)關(guān),我

2、想要看 懂他的示例就要將這個(gè)東西都搞懂, 就分散了我的注意力。 我個(gè)人總結(jié), 學(xué)習(xí)設(shè) 計(jì)模式的方法是, 首先找到一個(gè)突破口, 比如可以先學(xué)習(xí)構(gòu)造型模式中簡(jiǎn)單的模 式,將它理解、熟練應(yīng)用。通過(guò)對(duì)一、兩個(gè)模式有一個(gè)深入的認(rèn)識(shí)之后,再學(xué)習(xí) 其它比較復(fù)雜一點(diǎn)的模式就容易多了, 這是一種迭代的思想在學(xué)習(xí)中的應(yīng)用。 另 外學(xué)習(xí)任何一種設(shè)計(jì)模式的過(guò)程應(yīng)該是具體抽象再具體這個(gè)的一個(gè)過(guò)程。 這 句話(huà)的意思是首先通過(guò)一個(gè)比較具體一點(diǎn)的例子來(lái)幫助理解設(shè)計(jì)模式, 在理解之 后將你的理解擴(kuò)展到解決這一類(lèi)問(wèn)題, 上升到一定的理論高度。 然后就是再到具 體,也就是應(yīng)用設(shè)計(jì)模式,應(yīng)用理論解決自己遇到的實(shí)際問(wèn)題。2、學(xué)習(xí)工廠模

3、式的預(yù)備知識(shí):首先聲明這些預(yù)備知識(shí)并不是工廠模式僅僅需要,因?yàn)槲蚁戎v述工廠模式, 所以在學(xué)習(xí)工廠模式之前將這些問(wèn)題提出2.1 Upcast ingUpcast ing中文翻譯有好幾個(gè),比如向上類(lèi)型轉(zhuǎn)換、向上轉(zhuǎn)型、上溯造型。我個(gè)人比較喜歡向上轉(zhuǎn)型這個(gè)翻譯,即簡(jiǎn)單又含義明確。向上轉(zhuǎn)型這個(gè)概念,我在Bruce EckeI的Thinking in C+、Thinking in Java中都看到過(guò),我不是很確定這 個(gè)概念是否是他提出來(lái)的。向上轉(zhuǎn)型是把一個(gè)派生類(lèi)當(dāng)作它的基類(lèi)使用。我們將一個(gè)更特殊的類(lèi)型轉(zhuǎn)換到一個(gè)更常規(guī)的類(lèi)型,這當(dāng)然是安全的。派生類(lèi)是基類(lèi)的一個(gè)超集。它可以包含比基類(lèi)更多的方法,但它至少包含了

4、基類(lèi)的方法。向上轉(zhuǎn)型給我們帶來(lái)的好處就是我們可以將不同的派生通過(guò)一種統(tǒng)一的方式進(jìn)行處理。 向上轉(zhuǎn)型帶來(lái)的弊端就是我們向上轉(zhuǎn)型的過(guò)程會(huì)丟失派生類(lèi)的接口。既然有向上轉(zhuǎn)型,也就有向下轉(zhuǎn)型即 Dow nCast ing,我們?cè)诖瞬蛔鲈敿?xì)討論。下面使用一個(gè) 例子來(lái)示例向上轉(zhuǎn)型。public class Base public void Test() MessageBox.Show("OK");public class Derive:Base private void butt on 1_Click(object sen der, System.Eve ntArgs e) Base b

5、=new Derive();b.Test();2.2多態(tài)我不敢想象離開(kāi)了多態(tài)后的設(shè)計(jì)模式是一個(gè)什么樣子。什么是多態(tài),我喜歡總結(jié)這樣一句話(huà)來(lái)回答這個(gè)問(wèn)題,“一個(gè)接口,多種實(shí)現(xiàn)”。注意這里的接口不僅僅表示In terface關(guān)鍵字,是廣義上的接口。在C#中實(shí)現(xiàn)接口我們有兩種途徑, 一種是借助繼承來(lái)實(shí)現(xiàn),一種是借助In terface來(lái)實(shí)現(xiàn)。3、工廠設(shè)計(jì)模式理論3.1概述工廠模式具體包括了簡(jiǎn)單工廠、工廠方法、抽象工廠,它們是按照從簡(jiǎn)單到 復(fù)雜的順序排列的,屬于設(shè)計(jì)模式中的創(chuàng)建型,其中簡(jiǎn)單工廠并不屬于GOF的23中模式。但是它是理解其它的工廠模式的一個(gè)很好的基礎(chǔ),所以很多人在講 述設(shè)計(jì)模式的時(shí)候會(huì)提到

6、簡(jiǎn)單工廠模式。創(chuàng)建型模式關(guān)注的是對(duì)象的創(chuàng)建,創(chuàng)建 型模式將創(chuàng)建對(duì)象的過(guò)程進(jìn)行了抽象,也可以理解為將創(chuàng)建對(duì)象的過(guò)程進(jìn)行了封 裝,作為客戶(hù)程序僅僅需要去使用對(duì)象,而不再關(guān)心創(chuàng)建對(duì)象過(guò)程中的邏輯。3.2不使用任何模式我們現(xiàn)在有這樣的一個(gè)設(shè)計(jì),影像家電(VideoWiring)包括了 DVD、VCD。在基類(lèi)VideoWiring中有PlayVideo方法,子類(lèi)重載了這個(gè)方法。我們?nèi)绾蝸?lái)調(diào)用PlayVideo進(jìn)行播放呢。我們可以看到下面的代碼可以實(shí)現(xiàn)。下面是調(diào)用對(duì)象的方法進(jìn)行播放的代碼:public abstract class VideoWiringpublic abstract string Pla

7、yVideo。;public class VCD: VideoWiringpublic override string PlayVideo()return "正在播放播放 VCD"public class DVD: VideoWiringpublic override string PlayVideo()return "正在播放播放 DVD"dvd.PlayVideo()這樣的語(yǔ)句。private void PlayVideo()DVD dvd=new DVD();MessageBox.Show(dvd.PlayVideo();VCD vcd=new V

8、CD();MessageBox.Show(VCD.PlayVideo();上面的代碼可以實(shí)現(xiàn)功能但是不好, 為什么呢?類(lèi)實(shí)現(xiàn)了多態(tài),但是我們?cè)?調(diào)用的時(shí)候并沒(méi)有利用多態(tài)。如果我們有很多的影像家電產(chǎn)品,就需要寫(xiě)很多的 類(lèi)似F面是使用多態(tài)完成播放功能的代碼:private void PlayVideo()Play(vw); vw=new VCD();Play(vw);private void Play(VideoWiring vw) string str=vw.PlayVideo();MessageBox.Show(str);無(wú)論是什么影像家電產(chǎn)品,我們都可以使用一個(gè)統(tǒng)一的方式進(jìn)行播放,即 vw.

9、PlayVideo()。我們?cè)儆懻撘幌拢?上面的代碼存在的問(wèn)題。 雖然上的代碼很短, 應(yīng)該不會(huì)有 問(wèn)題,但是我們定位的目標(biāo)應(yīng)該更高些, 應(yīng)該考慮怎樣達(dá)到良好的封裝效果, 減 少錯(cuò)誤修改的機(jī)會(huì)。 我們自然的應(yīng)該考慮對(duì)象創(chuàng)建的問(wèn)題了, 能不能讓不同的影 像家電產(chǎn)品的創(chuàng)建方式相同, 而且這個(gè)創(chuàng)建過(guò)程對(duì)使用者封裝, 也就是說(shuō)讓對(duì)象 的創(chuàng)建象播放功能那樣簡(jiǎn)單、 統(tǒng)一。 如果能夠?qū)崿F(xiàn), 會(huì)給我們的系統(tǒng)帶來(lái)更大的 可擴(kuò)展性和盡量少的修改量?!巴郏∧窃摱嗪醚健??!安灰w慕了,來(lái)看看簡(jiǎn)單 工廠模式,聽(tīng)說(shuō)它能夠?qū)崿F(xiàn)”。3.3 簡(jiǎn)單工廠模式我們使用簡(jiǎn)單工廠對(duì)上面的代碼繼續(xù)改進(jìn), 根據(jù)上面的分析我們考慮對(duì)對(duì)象 創(chuàng)建進(jìn)

10、行近一步的封裝。 使用一個(gè)類(lèi)專(zhuān)門(mén)來(lái)完成對(duì)對(duì)象創(chuàng)建的封裝, 這個(gè)類(lèi)我們 稱(chēng)為工廠, 因?yàn)樗淖饔煤軉我痪蜕沙鲆粋€(gè)個(gè)的類(lèi)。 下面是一個(gè)工廠類(lèi)的示例 代碼:public static VideoWiring factory(stringVideoName)switch(VideoName)case "DVD": return new DVD();case "VCD": return new VCD();return null;這樣我們的客戶(hù)端代碼又可以更加有效簡(jiǎn)潔了:注意:在上面的兩段代碼示例中我們就已經(jīng)使用了向上轉(zhuǎn)型。首先注意在Create類(lèi)的factor

11、y方法中使用了 return new DVD();這樣的語(yǔ)句,但是這個(gè)函數(shù)的返回值卻是VideoWiring,它DVD類(lèi)的基類(lèi)。所以我們的客戶(hù)程序才可以使用VideoWiring vw=Create.factory("DVD")這樣的語(yǔ)句。這樣客戶(hù)程序并不關(guān)心創(chuàng)建是 如何完成的,以及創(chuàng)建的對(duì)象是什么,我們都可以調(diào)用基類(lèi)統(tǒng)一的接口實(shí)現(xiàn)他們 的功能。使用UML表示如下圖所示:private void PlayVideo()VideoWiring vw=Create.factory("DVD"); vw.PlayVideo();vw=Create.factor

12、y("VCD"); vw.PlayVideo();角色說(shuō)明:工廠類(lèi)(Creator):根據(jù)業(yè)務(wù)邏輯創(chuàng)建具體產(chǎn)品,由客戶(hù)程序直接調(diào)用。抽象產(chǎn)品(Product):作為具體產(chǎn)品的基類(lèi),提供統(tǒng)一的接口,也是工廠類(lèi)要返回的類(lèi)型。具體產(chǎn)品(Concrete Produc:工廠類(lèi)真正要?jiǎng)?chuàng)建的類(lèi)型。上圖中僅僅展示 了一個(gè)具體產(chǎn)品,有多個(gè)產(chǎn)品的時(shí)候類(lèi)似。F面我們對(duì)簡(jiǎn)單工廠模式進(jìn)行總結(jié)。使用簡(jiǎn)單工廠的好處是:1、充分利用了多態(tài)性不管什么具體產(chǎn)品都返回抽象產(chǎn)品。2、充分利用了封裝性,內(nèi)部產(chǎn)品發(fā)生變化時(shí)外部使用者不會(huì)受到影響。缺點(diǎn)是:如果增加了新的產(chǎn)品,就必須得修改工廠 (Factory)。抽象

13、工廠模式可以向客戶(hù)端提供一個(gè)接口, 使得客戶(hù)端在不必指定產(chǎn)品的具體類(lèi)型的情況下,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象。這就是抽象工廠模式的用意我們將工廠模式推廣到一般的情況,它的類(lèi)圖如下所示:在有名的00D的設(shè)計(jì)原則中有一個(gè)叫做里氏代換原則 (Liskov SubstitutionPrinciple, LSP)它的實(shí)質(zhì)也就是講向上轉(zhuǎn)型。它的內(nèi)容是:任何接收父類(lèi)型的地 方,都應(yīng)當(dāng)能夠接收子類(lèi)型,換句話(huà)說(shuō)如果使用的是一個(gè)基類(lèi)的話(huà),那么一定適用于其子類(lèi),而且程序察覺(jué)不出基類(lèi)對(duì)象和子類(lèi)對(duì)象的區(qū)別。LSP是繼承復(fù)用的基石,只有當(dāng)派生類(lèi)可以替換掉基類(lèi),軟件的功能不受到影響時(shí),基類(lèi)才能真正 被復(fù)用。3.4工廠方法有了

14、簡(jiǎn)單工廠模式后,已經(jīng)給我們帶來(lái)了一些好處,但是還存在一些問(wèn)題, 如果我們又多了一個(gè)影像家電產(chǎn)品 MP4之后,我們可以使MP4類(lèi)從VideoWiring 派生,但是卻要修改Create類(lèi)的代碼使它能夠生產(chǎn)出 MP4這個(gè)產(chǎn)品來(lái)。不好的 地方就在于,我們每次多一個(gè)產(chǎn)品的時(shí)候都需要修改 Create而不是保持原來(lái)的代 碼不修改僅僅進(jìn)行一種擴(kuò)展。在 Create類(lèi)中修改不是每次都簡(jiǎn)單的多一個(gè) Case語(yǔ)句就能夠解決問(wèn)題。因?yàn)镃reate類(lèi)中還封裝了創(chuàng)建對(duì)象的邏輯,有可能還需要 修改這些邏輯。這就違反了面向?qū)ο笤O(shè)計(jì)中一個(gè)很重要的原則“開(kāi)-閉”原則?!伴_(kāi)-閉”原則( the Open Closed Prin

15、ciple OCP):在面向?qū)ο笤O(shè)計(jì)中,如何通過(guò)很小的設(shè)計(jì)改變就可以應(yīng)對(duì)設(shè)計(jì)需求的變化, 這是令設(shè)計(jì)者極為關(guān)注的問(wèn)題。 開(kāi)閉原則就是 一個(gè)軟件實(shí)體在擴(kuò)展性方面應(yīng)該是 開(kāi)放的而在更改性方面應(yīng)該是封閉的。 這個(gè)原則說(shuō)的是, 在設(shè)計(jì)一個(gè)模塊的時(shí)候, 應(yīng)當(dāng)使這個(gè)模塊可以在不被修改的前提下被擴(kuò)展。 通過(guò)擴(kuò)展已有的軟件系統(tǒng), 可 以提供新的行為, 以滿(mǎn)足對(duì)軟件的新需求, 使變化中的軟件系統(tǒng)有一定的適應(yīng)性 和靈活性。 已有的軟件模塊, 特別是最重要的抽象層模塊不能再修改, 這就使得 變化中的軟件系統(tǒng)有一定的穩(wěn)定性和延續(xù)性。 因此在進(jìn)行面向?qū)ο笤O(shè)計(jì)時(shí)要盡量 考慮接口封裝機(jī)制、抽象機(jī)制和多態(tài)技術(shù)。前邊設(shè)計(jì)(簡(jiǎn)單

16、工廠)中存在的問(wèn)題就是它分裝了創(chuàng)建不同對(duì)象的邏輯,當(dāng)有新的產(chǎn)品的時(shí)候不易擴(kuò)展。在開(kāi)閉原則的指導(dǎo)下我們考慮如何重新修改前邊的 設(shè)計(jì),我們要盡量使用抽象機(jī)制和多態(tài)技術(shù)。我們放棄對(duì)創(chuàng)建不同對(duì)象的邏輯的 封裝,也采用類(lèi)似產(chǎn)品的方式,抽象出抽象工廠,具體工廠,具體工廠從抽象工 廠派生,每個(gè)具體工廠中生產(chǎn)一種具體的產(chǎn)品?!疤袅?,告訴你,你的這個(gè)想 法就是工廠方法模式”。F面使用工廠方法模式修改前邊的設(shè)計(jì):!“BiL I A i-丄-1 A faI 1. X -*£i 曲護(hù) LMsj VHrtfisr t r i r !- -r - f -f/r7?L?L BT. r T T T -918 *

17、-b4.kx »«.UVOCi*ateVGDCreeteovn¥蝕dgryVid W ii ng3 ctQiy *i T e oWiringVideoWiring、DVD、VCD三個(gè)類(lèi)的代碼和前邊的相同,下面我們看看在客戶(hù)端如何使用public abstract class Create public abstract VideoWiringfactory。;public class DVDCreate: Create public override VideoWiring return new DVD();factory。F面我們考慮需要擴(kuò)展一個(gè)新的產(chǎn)品 MP4

18、的時(shí)候如何處理private void PlayVideo()VideoWiring dvd,vcd;Create dvdCreate,vcdCreate; dvdCreate=new DVDCreate(); dvd=dvdCreate.factory();Play(dvd);vcdCreate=new VCDCreate(); vcd=vcdCreate.factory();Play(vcd);DVD我們來(lái)看看增加的代碼:public class MP4Create: Createpublic override VideoWiring factory。return new MP4(); p

19、ublic class MP4: VideoWiringpublic override string PlayVideo()return "正在播放MP4"我們?cè)倏纯纯蛻?hù)端代碼:MP4的時(shí)候沒(méi)有修改原來(lái)的代碼,而僅僅是對(duì)原來(lái)的功能進(jìn)行擴(kuò)展系統(tǒng)便有了MP4這個(gè)產(chǎn)品的功能。private void PlayVideo()VideoWiring dvd,vcd;Create dvdCreate,vcdCreate;dvdCreate=new DVDCreate();dvd=dvdCreate.factory();Play(dvd);vcdCreate=new VCDCreate(

20、);vcd=vcdCreate.factory();Play(vcd);/下面是新增的代碼VideoWiring mp4;Create mp4Create;mp4Create=new MP4Create();mp4=mp4Create.factory();Play(mp4);我們可以看出使用了工廠方法模式后,很好的滿(mǎn)足了開(kāi)閉原則,當(dāng)我們?cè)黾恿艘粋€(gè)新的產(chǎn)品將工廠方法模式推廣到一般情況:r*= rn'i ".rF =.ii-tr -crgartarZQoattv 也世口1 .FFoquot*!n=iriJJCreate:Product8機(jī)叩肚斶onGonerCui 口 mePrM

21、ucuconcferieProoiMtzdorjf P- .ductH-tiactory Prodijcl+ 匚f 凱 id Prttd u _L1+ C ti he relePrDiSLr. t2L1i-lerfa.tLTBSfOf角色說(shuō)明:抽象工廠(Creator):定義具體工廠的接口,所有的創(chuàng)建對(duì)象的工廠類(lèi)都必 須實(shí)現(xiàn)這些接口。具體工廠(ConcreteCreato:具體工廠包含與應(yīng)用密切相關(guān)的邏輯。復(fù)雜創(chuàng)建具體的產(chǎn)品。抽象產(chǎn)品(Product):所有產(chǎn)品的基類(lèi)。具體產(chǎn)品(ConcreteProduct)實(shí)現(xiàn)抽象產(chǎn)品申明的接口。工廠方法模式所創(chuàng) 建的每個(gè)對(duì)象都是某個(gè)具體產(chǎn)品的實(shí)例。工廠方

22、法模式的用意是定義一個(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)則成為了一個(gè)抽象工廠角色,僅負(fù)責(zé)給出具體工廠 子類(lèi)必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類(lèi)應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。這種進(jìn) 步抽象化的結(jié)果,使這種工廠方法模式可以用來(lái)允許系統(tǒng)在不修改具體工廠角色 的情況下引進(jìn)新的產(chǎn)品。3.5 抽象工廠模式我們繼續(xù)對(duì)影像家電產(chǎn)品的情形進(jìn)行分析,我們已經(jīng)可以使用工廠方法比 較好的

23、實(shí)現(xiàn)了產(chǎn)品的創(chuàng)建, 但是在以前的分析中我們并沒(méi)有考慮產(chǎn)品種類(lèi)及生產(chǎn) 廠家這樣的問(wèn)題。就拿 DVD 來(lái)說(shuō) TCL 可以生產(chǎn)、 LG 也生產(chǎn)等等很多廠家都生 產(chǎn)。 DVD 是產(chǎn)品種類(lèi)中的一種,產(chǎn)品種類(lèi)這個(gè)概念在有些書(shū)上稱(chēng)為產(chǎn)品族。從 另外一個(gè)角度來(lái)看 TCL 可以生產(chǎn) DVD 、 VCD 等等很多產(chǎn)品,這些產(chǎn)品在一起 就可以構(gòu)成一個(gè)產(chǎn)品結(jié)構(gòu)。 當(dāng)我們考慮了這些問(wèn)題后, 提出了兩個(gè)概念: 產(chǎn)品種 類(lèi)、產(chǎn)品結(jié)構(gòu)。 我們?cè)诠S方法中討論的是一個(gè)個(gè)單一的產(chǎn)品的創(chuàng)建, 如果我們 對(duì)這個(gè)問(wèn)題進(jìn)行進(jìn)一步的研究、 拓展,就應(yīng)該從單一的產(chǎn)品過(guò)度到多個(gè)產(chǎn)品種類(lèi), 在工廠方法中我們考慮 DVD 是一個(gè)單一的產(chǎn)品,現(xiàn)在我

24、們認(rèn)為 DVD 是一個(gè)產(chǎn) 品種類(lèi),有 TCL 生產(chǎn)的 DVD ,有 LG 生產(chǎn)的 DVD , VCD 是另一個(gè)產(chǎn)品種類(lèi), 有TCL生產(chǎn)的VCD,有LG生產(chǎn)的VCD。就這個(gè)問(wèn)題我們重新分析,有兩個(gè)產(chǎn) 品種類(lèi)分別是DVD、VCD,有兩個(gè)工廠是TCL和LG ,它們分別生產(chǎn)DVD和 VCD。我們使用下面的類(lèi)圖來(lái)表示:LGDVD廠TCLDVD+PlyVidiOStnnfl+f-t'/ideo JtHtigLGVCD斗 win#咖如MOT心m.7CLVCD*Fliyvide5;(virgTCL.Cr«4lff廠廣yL1 *+ 話(huà) ctprjDlO Dl'D1 -*-fgcCMyD

25、VD:DVD4<jrtoryVCDVCOPm砂fCD科g.'rUd/Jf* Sfnr-gDVD是抽象類(lèi)它提供統(tǒng)一的接口, LGDVD、TCLDVD是兩個(gè)具體的類(lèi)。VCD和DVD類(lèi)似。有一個(gè)抽象的工廠 Create,從它派生了兩個(gè)具體的類(lèi)TCLCreate LGCreateo Create中提供了兩個(gè)抽象方法 factoryDVD 和 factoryVCD 它們提供了兩個(gè)接口,用于創(chuàng)建DVD產(chǎn)品和VCD產(chǎn)品。在TCLCreate LGCreate 中實(shí)現(xiàn)這兩個(gè)方法。這樣TCLCreate就可以創(chuàng)建自己的DVD、VCD,同樣LGCreate 也可以傳經(jīng)自己的產(chǎn)品。下面是代碼結(jié)構(gòu):pu

26、blic abstract class Create public abstract DVD factoryDVD(); public abstract VCD factoryVCD();public class LGCreate: Create public override DVD factoryDVD() return new LGDVD();public override VCD factoryVCD() return new LGVCD();public class TCLCreate: Create public override DVD factoryDVD() return n

27、ew TCLDVD();public override VCD factoryVCD() return new TCLVCD();public abstract class DVD public abstract string PlayVideo();public class LGDVD: DVD public override string PlayVideo() return "LG 的 DVD 在播放"public class TCLDVD: DVD public override string PlayVideo() return "TCL的DVD 正在播

28、放"public abstract class VCD public abstract string PlayVideo();public class LGVCD: VCD public override string PlayVideo() return "LG的VCD正在播放"客戶(hù)端使用抽象工廠代碼如下:private void butt on 1_Click(object sen der, System.Eve ntArgs e) Create TCL,LG;TCL=new TCLCreate();LG=new LGCreate();PlayDVD(TCL)

29、; / 輸岀“ TCL的 DVD 在播放”P(pán)layDVD(LG); / 輸岀“ LG 的 DVD 在播放”private void PlayDVD(Create create)DVD dvd=create.factoryDVD();MessageBox.Show(dvd.PlayVideo();F面將抽象工廠模式推廣到一般情況,它的類(lèi)圖如下所示:interface Creator+ factory: Pfodtjc tA+ fetrfoyS Produc IB4L+(actoryA:PracluctA +fa ctoryB: Prod dcIBiinterface P/oductAPro duc

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論