一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

C#面向?qū)ο笤O(shè)計(jì)模式縱橫談:Factory Method 工廠方法模式

  從耦合關(guān)系談起

  耦合關(guān)系直接決定著軟件面對變化時的行為

  -模塊與模塊之間的緊耦合使得軟件面對變化時,相關(guān)模塊都要隨之更改

image

  -模塊與模塊之間的松耦合使得軟件面對變化時,一些模塊更容易被替換或者更改,但其他模塊保持不變

image

  抽象部分變化慢,細(xì)節(jié)(具體)部分變化快;高層部分變化慢,底層部分變化快。

  當(dāng)我們對于系統(tǒng)的認(rèn)識無法梳理出上面的圖時,最好不要一開始就用設(shè)計(jì)模式,設(shè)計(jì)模式其實(shí)是一個演繹的過程。當(dāng)我們對軟件認(rèn)識不斷深化時,慢慢就會知道哪些是主要的,哪些是次要的,就能梳理出一個抽象和具體的層次,再考慮用哪種設(shè)計(jì)模式。

  第二幅圖滿足了依賴倒置原則,中間的主線是變化慢的部分,分支都是用接口相連。這樣的松耦合使得模塊與模塊之間的連接用接口連接,接口是相對穩(wěn)定的部分,接口的實(shí)現(xiàn)是相對變化的部分。例如:去幫我買一條毛巾,只告訴了是毛巾這樣事物,而毛巾的具體品種、顏色并沒有具體的需求。大自然創(chuàng)造的世界,遍地都是松耦合、高內(nèi)聚。例如屋子里的凳子和桌子、床單和被子等,當(dāng)我們需要換床單時,是不需要換床的。床和床單之間有一個接口,床是主線,床需要床單的接口,只要具體的床單滿足這個尺寸接口,就可以接上。主邏輯的變化成本比輔邏輯的變化成本高,所以盡量讓輔邏輯的變化較少的影響主邏輯。因此我們設(shè)計(jì)軟件的原則是,先穩(wěn)定下接口,再考慮具體實(shí)現(xiàn)。

  動機(jī)(Motivation)

  在軟件系統(tǒng)張中,經(jīng)常面臨著“某個對象”的創(chuàng)建工作:由于需求的變化,這個對象(的具體實(shí)現(xiàn))經(jīng)常面臨著劇烈的變化,但是它卻擁有比較穩(wěn)定的接口。如何應(yīng)對這種變化?如何提供一種“封裝機(jī)制”來隔離出“這個易變對象”的變化,從而保持系統(tǒng)中“其他依賴對象的對象”不隨著需求改變而改變?

  結(jié)構(gòu)(Structure)

image

  例說Factory Method應(yīng)用

  汽車

image

  汽車測試

image

  但是這種測試只能測試一種Car,如果要測試其他類型的Car,需要修改代碼并重新編譯。為了應(yīng)對這種改變,我們需要把Car先變成抽象類。

image

  然后我們在客戶程序使用的時候,把所有的Car都換成抽象的AbstractCar,這樣客戶程序就不需要了解具體測試的是哪個Car了??蛻舫绦蛉缦?/p>

image

  但這種代碼明顯是錯誤的,抽象類不能直接實(shí)例化,因此我們比較好的方法是把抽象的Car傳遞進(jìn)來

image

  如果現(xiàn)在我們需要Car的多個實(shí)例,那么參數(shù)只接收一個抽象的Car就顯得不那么適用了。我們可能想到的方法是把傳進(jìn)來的Car做一個淺拷貝Memberwise,但是淺拷貝是一個protected方法,并且不能拷貝引用,但是這也是有辦法解決的,這種克隆的做法可以,但是現(xiàn)在我們研究另一種做法。我們希望能有一個創(chuàng)建Car的工廠,這樣我們在客戶程序就不需要關(guān)心Car的實(shí)例,只管用這個工廠去創(chuàng)建具體的Car。

image

  Car的具體實(shí)現(xiàn)

image

  Car工廠

image

  (糾正:CarFactory類中的CreateCar方法應(yīng)該返回抽象的AbstractCar類型,CarFactory的類和具體HongqiCarFactory的類在實(shí)際中應(yīng)該放在兩個不同的文件夾中)

  因?yàn)榭蛻舫绦蛐枰玫紺arFactory,所以CarFactory中不應(yīng)該涉及到Car的具體實(shí)現(xiàn),CarFactory應(yīng)該是一個抽象的工廠類,因此HongqiCar的工廠需要一個繼承自抽象CarFactory的具體工廠。在應(yīng)用程序調(diào)用的時候,傳入客戶程序的工廠應(yīng)該是具體的HongqiCarFactory工廠。

image

  當(dāng)想換具體Car的時候,只需要創(chuàng)建一個新的Car繼承自AbstractCar,并新建一個具體CarFactory工廠繼承自抽象CarFactory。然后在具體的應(yīng)用中把具體的Car工廠參數(shù)修改即可。當(dāng)然,完全可以讓具體應(yīng)用的代碼也不用修改,把變化轉(zhuǎn)嫁到配置文件中去。

  Factory Method模式的幾個要點(diǎn)

  Factory Method模式主要用于隔離類對象的使用者和具體類型之間的耦合關(guān)系。面對一個經(jīng)常變化的具體類型,緊耦合關(guān)系會導(dǎo)致軟件的脆弱。

  Factory Method模式通過面向?qū)ο蟮氖址?,將所要?chuàng)建的具體對象工作延遲到子類,從而實(shí)現(xiàn)一種擴(kuò)展(而非更改)的策略,較好地解決了這種緊耦合關(guān)系。

  Factory Method模式解決“單個對象”的需求變化;

  AbstractFactory模式解決“系列對象”的需求變化;

  Builder模式解決“對象部分”的需求變化;

  .NET框架中的Factory Method應(yīng)用

  SOAP、ASP.NET HttpHandler等

it知識庫C#面向?qū)ο笤O(shè)計(jì)模式縱橫談:Factory Method 工廠方法模式,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 2021免费日韩视频网 | 四虎影视永久免费观看网址 | 一区二区三区四区精品 | 99精品视频在线在线视频观看 | 日本不卡一区二区三区在线观看 | 欧美激情a∨在线视频播放 欧美激情不卡 | 国产欧美日韩综合精品无毒 | 久久精品久久精品久久精品 | 一区二区三区视频 | 国产午夜在线观看 | 一本大道加勒比久久 | 色综合久久六月婷婷中文字幕 | 五月婷婷激情综合网 | 影音先锋色偷偷米奇四色 | 狠狠大日本亚洲香蕉亚洲 | 亚洲a在线观看 | 香蕉草草久在视频在线播放 | 伊人久久综合谁合综合久久 | 国产女主播喷出白浆视频 | 美女一区二区三区 | 国产精品视频李雅 | 四虎精品永久在线 | 色综久久天天综合绕视看 | 国内精品视频成人一区二区 | 超91精品手机国产在线 | 站长推荐国产精品视频 | 中文字幕成人免费视频 | 美女久久精品 | 在线视频 二区 | 亚洲乱码在线 | 欧美日韩亚洲精品国产色 | 国语自产拍在线观看任你躁 | 成人免费视频网站 | 福利在线看 | 久久大胆人体 | 国产美女91 | 日韩视频久久 | 2021国产麻豆剧传媒精品网站 | 精品少妇一区二区三区视频 | 最新国产精品精品视频 | 69成人免费视频 |