設計模式 2/23 工廠模式
工廠模式是最常用的設計模式之一,用好了,代碼優雅,可維護性高,對系統設計會上一個臺階
為什麽這麽說,因為工廠模式可以牽扯出抽象工廠模式,也有大家都會聊到的簡單工廠模式
我們要了解一點,23中設計模式中,不包含簡單工廠模式,之所以大家會去聊這個,四個字,漸進明細
通過對簡單工廠模式的了解,我們引入工廠這個詞,不然一個寫代碼的,天天給他講工廠,工廠,工廠,西廠,東廠,會暈
同時,通過逐步的深入,從簡單工廠,到工廠模式,再到抽象工廠,漸進明細的過程,逐步深入的理解,比較優劣,擇優而為我們所用。
試想我們遇到以下情景,我們該怎麽處理
在工作中,我們需要處理不同類型的文件,有音頻的,視頻的,圖片的,文本的。通過程序的處理,我們可以分別提取到不同的信息。
這種情況你準備怎麽處理
工作經驗少的同學默默的心理噗嗤一聲,看我5分鐘搞定
class Program { static void Main() { var fileType = "Video"; switch (fileType) { case "Video": HandleVideoFile(fileType); break;View Codecase "Audio": HandleAudioFile(fileType); break; case "Image": HandleImageFile(fileType); break; case "Text": HandleTextFile(fileType); break; } Console.ReadKey(); } public static void HandleTextFile(string fileType) { Console.WriteLine("我開始處理文本文件了"); } public static void HandleImageFile(string fileType) { Console.WriteLine("我開始處理圖片文件了"); } public static void HandleAudioFile(string fileType) { Console.WriteLine("我開始處理音頻文件了"); } public static void HandleVideoFile(string fileType) { Console.WriteLine("我開始處理視頻文件了"); } }
各個方法封裝,獨立,可隨處調用,面向對象三大特性,簡簡單單隨隨便便給你展現一臉
後來,系統變強壯了,業務增加了,要求同時也能處理郵件Email
是不是你這個時候開始修改代碼,增加一個方法,添加一個case,break;
如果後續陸陸續續好幾十種繼續增加,怎麽辦。程序的可維護性,可擴展性在哪裏?
開放-封閉原則在哪裏?
開放-封閉原則是只軟件實體(類,模塊,函數等等),應該可以擴展,但是不可修改
拋開所有原則,再增加5個,你這個類的代碼得有1000行了吧,那麽多case,break, 那天稍微不小心的改錯一個,是不是會引起巨震。
所以,我們開始進行修改,也就是我們接下來進入正題的 簡單工廠模式。
所謂的簡單工廠模式,是將一個具體類的實例化交給一個工廠方法來執行
1個點,敲黑板,重點來了
工廠方法來執行。首先需要一個工廠,還需要一個方法。一個方法來幹嘛?來實例化具體的類,具體的什麽類?具體的算法類!
我們首先來定義一個抽象類
public abstract class Handle { public abstract void HandleFile(); }View Code
這個類告訴全世界,要實現我,就得實現我的方法,我們是強關系,我們是合成關系,我們是擁有關系,我們是鳥兒與翅膀的關系!
而且不準實現我,要實現,先繼承,要繼承,就得override我的所有方法
於是,不得已,要處理的類紛紛開始實現
文件處理類
/// <summary> /// 文本處理類 /// </summary> public class TextHandle : Handle { public override void HandleFile() { Console.WriteLine("我開始處理文本文件了"); } }View Code
圖片處理類
/// <summary> /// 圖片處理類 /// </summary> public class ImageHandle : Handle { public override void HandleFile() { Console.WriteLine("我開始處理圖片文件了"); } }View Code
視頻處理類
/// <summary> /// 視頻處理類 /// </summary> public class VideoHandle : Handle { public override void HandleFile() { Console.WriteLine("我開始處理視頻文件了"); } }View Code
音頻處理類
/// <summary> /// 音頻處理類 /// </summary> public class AudioHandle : Handle { public override void HandleFile() { Console.WriteLine("我開始處理音頻文件了"); } }View Code
所有的處理類我們定義好了,如果後續,業務變更,需求增加,再添加什麽郵件啊,電話啊,其他什麽的,我們只需要繼續添加我們的類,而不是通過去添加方法,這樣每個類的單一職責原則是不是體現的很淋漓盡致了,如果單一職責覺得太書面,我們換個稱呼,單一功能原則!沒法再簡單了
所有的處理類已經Ready了,我們的重點工廠可以開始修建了
public class HandleFactory { public Handle CreateHandle(string fileType) { Handle handle = null; switch (fileType) { case "Video": handle = new VideoHandle(); break; case "Audio": handle = new AudioHandle(); break; case "Image": handle = new ImageHandle(); break; case "Text": handle = new TextHandle(); break; } return handle; } }View Code
不要指指點點,不要指指點點,不要指指點點
我們就像項目過程一樣,漸進明細
這次介紹的是簡單工廠模式,簡單工廠重點是 簡單,工廠
後續增加業務的時候,我們只需要再加case,和對應的Handle類就好了
如何調用呢
class Program { static void Main() { var handleFactory = new HandleFactory(); var fileType = "Text"; var handle = handleFactory.CreateHandle(fileType); handle.HandleFile(); } }View Code
是不是一下簡單明了,你要是Web程序,可以,要是CS程序,可以,要是WebAPI,也可以
易擴展,可維護
總結下
優點
1、擴展性高,如果想增加一個處理方式,只要擴展一個處理類就可以。
2、屏蔽實現,只關心處理的結果
3、帶你走進工廠模式
缺點
1、每次增加一個處理對象的時候,都需要增加一個處理類,還要同時告訴工廠,增加處理類型
2、增加了系統具體類的依賴
以上就是關於簡單工廠模式的分享
一路前行,風雨無阻,不定時更新
設計模式 2/23 工廠模式