隨手Design Pattern (3) - 簡單工廠模式(Simple Factory Pattern)

文章推薦指數: 80 %
投票人數:10人

參考範例 簡單工廠是相當易用的一種設計模式,當程式複雜度高的時候時候,可以利用此模式切割複雜度高的判斷式,抽離業務邏輯與建構式,讓業務邏輯單純,隔離複雜的建構式,有效提升程式碼的可讀性,藉由C#語法特性更可以降低程式複雜度。

定義簡單工廠模式(SimpleFactoryPattern):又稱為靜態工廠方法(StaticFactoryMethod)模式,它屬於類創建型模式。

角色簡單工廠模式包含如下角色: Product:抽象產品角色抽象產品角色是所有產品的父類別,在C#來說可以是抽象類別(AbstractClass)或者是介面(Interface),公開屬性與方法簽章,外部程式依賴此角色。

ConcreteProduct:具體產品角色具體產生的產品實體,藉由工廠角色依據條件而建立。

Factory:工廠角色工廠角色負責建立對應的物件。

UML類別圖 實作說明抽象產品角色-本次範例用IBrid介面來示範,公開Name屬性與Fly方法。

123456publicinterfaceIBird{stringName{get;set;}voidFly();} 具體產品角色-Eagle&Swan兩種鳥類的具體實作 123456789publicclassEagle:IBird{publicstringName{get;set;}="老鷹";publicvoidFly(){//實作可以飛高空}} 123456789publicclassSwan:IBird{publicstringName{get;set;}="天鵝";publicvoidFly(){//實作只能飛低空}} 工廠角色:使用switch實作 1234567891011121314151617publicstaticclassBirdFactory{publicstaticIBirdGetBird(stringbirdName){switch(birdName){case"Swan":returnnewSwan();case"Eagle":returnnewEagle();default:thrownewException("missingmatchingbirdname");}}} 12345678privatestaticvoidMain(string[]args){vareagle=BirdFactory.GetBird("Eagle");varswan=BirdFactory.GetBird("Swan");Console.WriteLine($"BirdName:{eagle.Name}");Console.WriteLine($"BirdName:{swan.Name}");} 藉由BirdFactory將switch判斷式抽離,Main程式複雜度下降,這也就是簡單工廠帶來的效益,專注商業邏輯,抽離複雜的判斷式。

但是其實這仍不夠好,隨著實作IBird的鳥類越來越來多,BirdFactory裡的switch會越來越複雜,也就越來越難維護。

這裡使用的是CodeMaid的Spade功能,有時間在另外做說明! 這裡在提供一個使用Linq語法取代switch語法的範例,可以有效地降低複雜度。

123456789101112131415161718192021publicstaticclassBirdFactoryWithLinq{privatestaticreadonlyDictionary_birds;staticBirdFactoryWithLinq(){_birds=newDictionary();_birds.Add("Eagle",newEagle());_birds.Add("Swan",newSwan());}privatestaticIBirdGetBird(stringbirdName){varbird=_birds.Where(x=>x.Key.Equals(birdName)).Select(x=>x.Value).FirstOrDefault();returnbird??thrownewException("Nomatchbird!");}} GetBird的複雜度由4降為1,是不是很完美。

結論 優點 工廠封裝了各類別的建構式邏輯,客戶端不需要知道如何建構類別實體,可以直接操作公開的方法,做到實質的隔離,達成了職責分離。

透過參數設定檔,可以實現不修改成客戶端程式碼的,而增加可以使用類別。

缺點 使用簡單工廠模式將會增加系統中類別的數量,純理論來說增加了系統的複雜度和理解難度。

有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護。

因使用靜態方法,所以工廠類別無法繼承。

總結優缺點,在情境式適合下,簡單工廠很容易的做到職責分離,搭配C#Linq更可以有效降低工廠的程式複雜度,是很值得使用的! 參考範例Github範例下載連結 相關文章 隨手DesignPattern(2)-軟體分層設計模式(SoftwareLayeredArchitecturePattern) 隨手DesignPattern(5)-雙重檢查鎖定模式(Double-CheckedLockingPattern) 隨手DesignPattern(6)-單例模式(SingletonPattern) 隨手DesignPattern(4)-Repository模式(RepositoryPattern) 在ASP.NETCore中使用AutoMapper 作者:RayChiu 文章連結: https://raychiutw.github.io/2019/隨手-Design-Pattern-3-簡單工廠模式-Simple-Factory-Pattern/ 版權聲明:本網誌所有文章除特別聲明外,均採用BY-NC-SA許可協議。

轉載請註明出處! 文章目錄 本站概要 RayChiu 28 文章 5 分類 31 標籤 RSS GitHub 1.定義2.角色3.UML類別圖4.實作說明5.結論6.參考範例 0%



請為這篇文章評分?