您好,登錄后才能下訂單哦!
C#中怎么實現(xiàn)工廠方法模式,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
工廠方法模式的胡介紹
2.1、動機(Motivate)
在軟件系統(tǒng)的構(gòu)建過程中,經(jīng)常面臨著“某個對象”的創(chuàng)建工作:由于需求的變化,這個對象(的具體實現(xiàn))經(jīng)常面臨著劇烈的變化,但是它卻擁有比較穩(wěn)定的接口。
如何應(yīng)對這種變化?如何提供一種“封裝機制”來隔離出“這個易變對象”的變化,從而保持系統(tǒng)中“其他依賴對象的對象”不隨著需求改變而改變?
2.2、意圖(Intent)
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method使得一個類的實例化延遲到子類。 --《設(shè)計模式》GoF
2.3、結(jié)構(gòu)圖(Structure)
2.4、模式的組成
可以看出,在工廠方法模式的結(jié)構(gòu)圖有以下角色:
(1)、抽象工廠角色(Creator): 充當(dāng)抽象工廠角色,定義工廠類所具有的基本的操作,任何具體工廠都必須繼承該抽象類。
(2)、具體工廠角色(ConcreteCreator):充當(dāng)具體工廠角色,該類必須繼承抽象工廠角色,實現(xiàn)抽象工廠定義的方法,用來創(chuàng)建具體產(chǎn)品。
(3)、抽象產(chǎn)品角色(Product):充當(dāng)抽象產(chǎn)品角色,定義了產(chǎn)品類型所有具有的基本操作,具體產(chǎn)品必須繼承該抽象類。
(4)、具體產(chǎn)品角色(ConcreteProduct):充當(dāng)具體產(chǎn)品角色,實現(xiàn)抽象產(chǎn)品類對定義的抽象方法,由具體工廠類創(chuàng)建,它們之間有一一對應(yīng)的關(guān)系。
2.5、工廠方法模式的代碼實現(xiàn)
【簡單工廠模式】的問題是:如果有新的需求就需要修改工廠類里面創(chuàng)建產(chǎn)品對象實例的那個方法的實現(xiàn)代碼,在面向?qū)ο笤O(shè)計一個原則就是哪里有變化,我就封裝哪里。還有另外兩個大的原則,其一是:面向抽象編程,細(xì)節(jié)和高層實現(xiàn)都要依賴抽象,第二個原則是:多組合,少繼承。這三個原則是最根本的原則,學(xué)習(xí)設(shè)計模式必須以這三個原則為基點,否則都是枉然。根據(jù)這三大原則又衍生出來6個具體的原則,分別是【單一職責(zé)原則】,【里氏替換原則】,【依賴倒置原則】,【接口隔離原則】、【迪米特法則】和【開閉原則】,既然工廠類有變化,我們就封裝它,面向抽象編程,我們先抽象出一個工廠基類,然后,每個需求就實現(xiàn)一個具體的工廠類,這樣我們就符合了【開閉原則OCP】,讓一個工廠生產(chǎn)一款產(chǎn)品,并一一對應(yīng)。我們把具體產(chǎn)品的創(chuàng)建推遲到子類中,此時工廠類(這類是基類了)不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而只是給出具體工廠必須實現(xiàn)的接口,這樣工廠方法模式就可以允許系統(tǒng)不修改工廠類邏輯的情況下來添加新產(chǎn)品,這樣也就克服了簡單工廠模式中缺點。下面就是工廠方法模式的實現(xiàn)代碼:
在【工廠方法模式】中,我們同樣也把汽車的類抽象出來一個抽象的基類,這里正好符合了【面向抽象編程】,客戶端在使用的時候不會依賴具體的什么汽車。使用工廠方法實現(xiàn)的系統(tǒng),如果系統(tǒng)需要添加新產(chǎn)品時,我們可以利用多態(tài)性來完成系統(tǒng)的擴展,對于抽象工廠類和具體工廠中的代碼都不需要做任何改動。例如,我們想增加一輛奔馳車,我們只需從Car抽象類下繼承一個BenChiCar類,同時在從Factory抽象基類下繼承一個“奔馳”的工廠類BenChinaCarFactory就可以了,這樣擴展符合OCP的原則。具體代碼為:
三、Factory Method模式的幾個要點
Factory Method模式主要用于隔離類對象的使用者和具體類型之間的耦合關(guān)系。面對一個經(jīng)常變化的具體類型,緊耦合關(guān)系會導(dǎo)致軟件的脆弱。
Factory Method模式通過面向?qū)ο蟮氖址ǎ瑢⑺獎?chuàng)建的具體對象工作延遲到子類,從而實現(xiàn)一種擴展(而非更改)的策略,較好地解決了這種緊耦合關(guān)系。
Factory Method模式解決“單個對象”的需求變化;
AbstractFactory模式解決“系列對象”的需求變化;
Builder模式解決“對象部分”的需求變化;
3.1】、工廠方法模式的優(yōu)點:
(1)、 在工廠方法中,用戶只需要知道所要產(chǎn)品的具體工廠,無須關(guān)系具體的創(chuàng)建過程,甚至不需要具體產(chǎn)品類的類名。
(2)、在系統(tǒng)增加新的產(chǎn)品時,我們只需要添加一個具體產(chǎn)品類和對應(yīng)的實現(xiàn)工廠,無需對原工廠進(jìn)行任何修改,很好地符合了“開閉原則”。
3.2】、工廠方法模式的缺點:
(1)、每次增加一個產(chǎn)品時,都需要增加一個具體類和對象實現(xiàn)工廠,是的系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時也增加了系統(tǒng)具體類的依賴。這并不是什么好事。
3.3】、工廠方法模式使用的場景:
(1)、一個類不知道它所需要的對象的類。在工廠方法模式中,我們不需要具體產(chǎn)品的類名,我們只需要知道創(chuàng)建它的具體工廠即可。
(2)、一個類通過其子類來指定創(chuàng)建那個對象。在工廠方法模式中,對于抽象工廠類只需要提供一個創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要創(chuàng)建的對象,在程序運行時,子類對象將覆蓋父類對象,從而使得系統(tǒng)更容易擴展。
(3)、將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類,需要時再動態(tài)指定。
四、.NET中實現(xiàn)了工廠方法的類
.NET 類庫中也有很多實現(xiàn)了工廠方法的類,例如Asp.net中,處理程序?qū)ο笫蔷唧w用來處理請求,當(dāng)我們請求一個*.aspx的文件時,此時會映射到System.Web.UI.PageHandlerFactory類上進(jìn)行處理,而對*.ashx的請求將映射到System.Web.UI.SimpleHandlerFactory類中(這兩個類都是繼承于IHttpHandlerFactory接口的),關(guān)于這點說明我們可以在“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Web.Config”文件中找到相關(guān)定義,具體定義如下:
配置文件截圖了一部分,有時間大家可以自己去研究一下。
下面我們就具體看下工廠方法模式在Asp.net中是如何實現(xiàn)的,如果對一個Index.aspx頁面發(fā)出請求時,將會調(diào)用PageHandlerFactory中GetHandler方法來創(chuàng)建一個Index.aspx對象,它們之間的類圖關(guān)系如下:
關(guān)于C#中怎么實現(xiàn)工廠方法模式問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。