溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中怎么實(shí)現(xiàn)抽象工廠模式

發(fā)布時(shí)間:2021-07-07 15:20:02 來源:億速云 閱讀:235 作者:Leah 欄目:大數(shù)據(jù)

C#中怎么實(shí)現(xiàn)抽象工廠模式,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

抽象工廠詳細(xì)介紹

  2.1、動(dòng)機(jī)(Motivate):

     在軟件系統(tǒng)中,經(jīng)常面臨著"一系統(tǒng)相互依賴的對(duì)象"的創(chuàng)建工作:同時(shí),由于需求的變化,往往存在更多系列對(duì)象的創(chuàng)建工作。如何應(yīng)對(duì)這種變化?如何繞過常規(guī)的對(duì)象創(chuàng)建方法(new),提供一種"封裝機(jī)制"來避免客戶程序和這種"多系列具體對(duì)象創(chuàng)建工作"的緊耦合?

  2.2、意圖(Intent):

    提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類。                            ——《設(shè)計(jì)模式》GoF

  2.3、結(jié)構(gòu)圖(Structure)

    C#中怎么實(shí)現(xiàn)抽象工廠模式

   該圖是抽象工廠的UML圖,結(jié)合抽象工廠的意圖、動(dòng)機(jī)和圖示來理解該模式,今天我們就以建設(shè)房子為例來說明抽象工廠的實(shí)現(xiàn)機(jī)理。

2.4、模式的組成

      可以看出,在抽象工廠模式的結(jié)構(gòu)圖有以下角色:

      (1)、抽象產(chǎn)品類角色(AbstractProduct):為抽象工廠中相互依賴的每種產(chǎn)品定義抽象接口對(duì)象,也可以這樣說,有幾種產(chǎn)品,就要聲明幾個(gè)抽象角色,每一個(gè)抽象產(chǎn)品角色和一種具體的產(chǎn)品相匹配。

      (2)、具體產(chǎn)品類(ConcreteProduct):具體產(chǎn)品類實(shí)現(xiàn)了抽象產(chǎn)品類,是針對(duì)某個(gè)具體產(chǎn)品的實(shí)現(xiàn)的類型。

      (3)、抽象工廠類角色(Abstract Factory):定義了創(chuàng)建一組相互依賴的產(chǎn)品對(duì)象的接口操作,每種操作和每種產(chǎn)品一一對(duì)應(yīng)。

      (4)、具體工廠類角色(ConcreteFactory):實(shí)現(xiàn)抽象類里面的所有抽象接口操作,可以創(chuàng)建某系列具體的產(chǎn)品,這些具體的產(chǎn)品是“抽象產(chǎn)品類角色”的子類。


2.5、抽象工廠的具體代碼實(shí)現(xiàn)

       隨著我們年齡的增大,我們也到了結(jié)婚的年齡。結(jié)婚首要的問題就是房子的問題,假設(shè)我有一個(gè)很有錢的爸爸,哈哈,有錢可以解決很多問題。作為長(zhǎng)子的我,希望能有一套歐式風(fēng)格的房子,再加上田園風(fēng)光,此生足矣。我弟弟就不一樣了,他想要一套現(xiàn)代樣式的房子,如果兄弟姊妹再多年一點(diǎn),那就有更多的要求了。由于房子由房頂、地板、窗戶和房門組成,其他組件暫時(shí)省略,有這么多套房子要建設(shè),每套房子的房頂、地板、窗戶和房門都是一個(gè)體系的,那就讓我們看看如何使用【抽象工廠】模式來實(shí)現(xiàn)不同房屋的建造。

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

2.6、 抽象工廠應(yīng)對(duì)需求變更

  讓我們看看該模式如何應(yīng)對(duì)需求的變化,假設(shè)我的表弟一看我們的房子很好,他也想要一套古典風(fēng)格的房子(哈哈,這個(gè)家伙事挺多的,有好事總是落不下他)。

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

 此時(shí),只需要添加五個(gè)類:一個(gè)是古典風(fēng)格工廠類,負(fù)責(zé)創(chuàng)建古典風(fēng)格的房子,另外幾個(gè)類是具有古典風(fēng)格的房頂、地板、窗戶和房門的具體產(chǎn)品。從上面代碼看出,抽象工廠對(duì)于系列產(chǎn)品的變化支持 “開放——封閉”原則(指的是要求系統(tǒng)對(duì)擴(kuò)展開放,對(duì)修改封閉),擴(kuò)展起來非常簡(jiǎn)便,但是,抽象工廠對(duì)于增加新產(chǎn)品這種情況就不支持”開放——封閉 “原則,因?yàn)橐薷膭?chuàng)建系列產(chǎn)品的抽象基類AbstractFactory,增加相應(yīng)產(chǎn)品的創(chuàng)建方法,這也是抽象工廠的缺點(diǎn)所在。

三、抽象工廠的實(shí)現(xiàn)要點(diǎn)

     1、如果沒有應(yīng)對(duì)“多系列對(duì)象創(chuàng)建”的需求變化,則沒有必要使用AbstractFactory模式,這時(shí)候使用簡(jiǎn)單的靜態(tài)工廠完全可以。

      2、"系列對(duì)象"指的是這些對(duì)象之間有相互依賴、或作用的關(guān)系,例如游戲開發(fā)場(chǎng)景中“道路”與“房屋”的依賴,“道路”與“地道”的依賴。

      3、AbstractFactory模式主要在于應(yīng)對(duì)“新系列”的需求變動(dòng)。其缺點(diǎn)在于難以應(yīng)對(duì)“新對(duì)象”的需求變動(dòng)。

      4、AbstractFactory模式經(jīng)常喝FactoryMethod模式共同組合來應(yīng)對(duì)“對(duì)象創(chuàng)建”的需求變化。

    3.1】、抽象工廠模式的優(yōu)點(diǎn):【抽象工廠】模式將系列產(chǎn)品的創(chuàng)建工作延遲到具體工廠的子類中,我們聲明工廠類變量的時(shí)候是使用的抽象類型,同理,我們使用產(chǎn)品類型也是抽象類型,這樣做就盡可能的可以減少客戶端代碼與具體產(chǎn)品類之間的依賴,從而降低了系統(tǒng)的耦合度。耦合度降低了,對(duì)于后期的維護(hù)和擴(kuò)展就更有利,這也就是【抽象工廠】模式的優(yōu)點(diǎn)所在??赡苡腥藭?huì)說在Main方法里面(這里的代碼就是客戶端的使用方)還是會(huì)使用具體的工廠類,對(duì)的。這個(gè)其實(shí)我們通過Net的配置,把這部分移出去,最后把依賴關(guān)系放到配置文件中。如果有新的需求我們只需要修改配置文件,根本就不需要修改代碼了,讓客戶代碼更穩(wěn)定。依賴關(guān)系肯定會(huì)存在,我們要做的就是降低依賴,想完全去除很難,也不現(xiàn)實(shí)。

   3.2】、抽象工廠模式的缺點(diǎn):有優(yōu)點(diǎn)肯定就有缺點(diǎn),因?yàn)槊糠N模式都有他的使用范圍,或者說要解決的問題,不能解決的問題就是缺點(diǎn)了,其實(shí)也不能叫缺點(diǎn)了?!境橄蠊S】模式很難支持增加新產(chǎn)品的變化,這是因?yàn)槌橄蠊S接口中已經(jīng)確定了可以被創(chuàng)建的產(chǎn)品集合,如果需要添加新產(chǎn)品,此時(shí)就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發(fā)——封閉”原則。

   3.3】、抽象工廠模式的使用場(chǎng)景:   如果系統(tǒng)需要多套的代碼解決方案,并且每套的代碼方案中又有很多相互關(guān)聯(lián)的產(chǎn)品類型,并且在系統(tǒng)中我們可以相互替換的使用一套產(chǎn)品的時(shí)候可以使用該模式,客戶端不需要依賴具體實(shí)現(xiàn)。

四、.NET中抽象工廠模式實(shí)現(xiàn)

微軟的類庫發(fā)展了這么多年,設(shè)計(jì)模式在里面有大量的應(yīng)用,【抽象工廠】模式在.NET類庫中也存在著大量的使用,比如和操作數(shù)據(jù)庫有關(guān)的類型,這個(gè)類就是System.Data.Common.DbProviderFactory,這個(gè)類位于System.Data.dll程序集中。該類扮演抽象工廠模式中抽象工廠的角色,我們可以用ILSpy反編譯工具查看該類的實(shí)現(xiàn):

/// 扮演抽象工廠的角色
/// 創(chuàng)建連接數(shù)據(jù)庫時(shí)所需要的對(duì)象集合,
/// 這個(gè)對(duì)象集合包括有 DbConnection對(duì)象(這個(gè)是抽象產(chǎn)品類,如絕味例子中的YaBo類)、DbCommand類、DbDataAdapter類,針對(duì)不同的具體工廠都需要實(shí)現(xiàn)該抽象類中方法,

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

DbProviderFactory類是一個(gè)抽象工廠類,該類提供了創(chuàng)建數(shù)據(jù)庫連接時(shí)所需要的對(duì)象集合的接口,實(shí)際創(chuàng)建的工作在其子類工廠中進(jìn)行,微軟使用的是SQL Server數(shù)據(jù)庫,因此提供了連接SQL Server數(shù)據(jù)的具體工廠實(shí)現(xiàn),具體代碼可以用反編譯工具查看,具體代碼如下:

SqlClientFactory扮演著具體工廠的角色,用來創(chuàng)建連接SQL Server數(shù)據(jù)所需要的對(duì)象

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

dbcFactory也是具體工廠類

C#中怎么實(shí)現(xiàn)抽象工廠模式

C#中怎么實(shí)現(xiàn)抽象工廠模式

關(guān)于C#中怎么實(shí)現(xiàn)抽象工廠模式問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI