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