工廠模式,簡單工廠模式,抽象工廠模式
說到這幾個工廠模式有很多相似之處又有不同。最重要的是掌握這種思想,在以後搭建專案架構或寫一些功能,應用這些思想,讓自己的程式更健壯,或者說當你看到別人寫的程式應用到了這種思想能夠快速理解。話不多說,咱們先從入門級的小案例講起。
一.簡單工廠模式
基本概念:簡單工廠模式是由一個工廠類根據接受到的訊息決定要建立哪一個類的物件例項。
優點:在客戶端只需要告訴工廠類建立什麼例項就行,而不要關注具體怎麼建立,因為那個工廠類有相關邏輯。
缺點:當新增新產品就不得不修改工廠邏輯,當型別較多時,可能造成工廠邏輯比較複雜,不利於系統的擴充套件和維護,所以從工廠的角度來說簡單工廠模式是不符合軟體設計原則的開閉原則(對擴充套件開放,對修改關閉)。
我們通過教科書級別的例子輔助理解程式碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SimpleFactory { class Program { static void Main(string[] args) { FlyFactory flyFactory = new FlyFactory(); flyFactory.GetFly(View Code"wuya").fly(); flyFactory.GetFly("yingwu").fly(); Console.ReadKey(); } } public interface IFly { void fly(); //預設公用方法 } public class Wuya : IFly { public void fly() { Console.WriteLine("我是一隻黑嗚嗚的烏鴉鳥,我會飛!"); } }public class YingWu : IFly { public void fly() { Console.WriteLine("我是一隻美麗的鸚鵡鳥,我會飛!"); } } public class FlyFactory //飛的工廠類 { public IFly GetFly(string type) { if ("wuya" == type) { return new Wuya(); } else if ("yingwu" == type) { return new YingWu(); } else { return null; } } } }
二.工廠模式
基本概念:定義一個建立物件的工廠介面,子類繼承這個介面,讓子類決定例項的建立。
優點:子類繼承建立物件的介面,讓子類決定具體例項化的物件,想要增加一個產品,只需要增加一個工廠類即可,克服了簡單工廠所違背的的開閉原則的缺點,擴充套件性高,易於維護.
缺點:程式碼量會比簡單工廠多了幾行,對與一些稍微複雜的業務,種類太多不太適合。
我們通過教科書級別的例子輔助理解程式碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Factory { class Program { static void Main(string[] args) { IFkyFactory wuYaFactory = new WuYaFatory(); wuYaFactory.GetFly().fly(); IFkyFactory yingWuFactory = new YingWuFactory(); yingWuFactory.GetFly().fly(); Console.ReadKey(); } } public interface IFly { void fly(); } public class Wuya : IFly { public void fly() { Console.WriteLine("我是一隻烏鴉鳥,我會飛!"); } } public class YingWu : IFly { public void fly() { Console.WriteLine("我是一隻美麗的鸚鵡鳥,我會飛!"); } } public interface IFkyFactory { IFly GetFly(); } public class WuYaFatory : IFkyFactory { public IFly GetFly() { return new Wuya(); } } public class YingWuFactory : IFkyFactory { public IFly GetFly() { return new YingWu(); } } }View Code
三.抽象工廠模式
基本概念:提供一個建立一系列相關或相互依賴物件的介面,而無需指定他們具體的類。
優點: 具有 工廠模式解耦的特點,此外當一個產品族中的多個物件被設計在一起工作時,它能保證客戶端始終只使用同一個產品族中的物件。工廠方法模式針對的是一個產品等級結構,抽象工廠模式針對的是面向多個產品等級結構,最主要的是可以在類的內部對產品族的關聯關係進行定義和描述。
缺點:雖然滿足各種軟體設計原則的優點,但是程式碼相對會多一些。
程式碼幫助理解,我們通過生產蘋果手機,華為手機的主機板,螢幕的例子如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractFactoryDemo { class Program { static void Main(string[] args) { IMobileFactory huaWeiMobileA = new ProductHuaWeiMobile(); Console.WriteLine("我是第一 一個華為手機,我擁有:"); //如果你想批量生產手機可以迴圈語句控制 huaWeiMobileA.ProductMobileBoard().ProductMobileBoard(); huaWeiMobileA.ProductMobileScreen().ProductMobileScreen(); IMobileFactory appleMobileX = new ProductAppleMobile(); Console.WriteLine("我是第一個蘋果手機,我擁有:"); appleMobileX.ProductMobileBoard().ProductMobileBoard(); appleMobileX.ProductMobileScreen().ProductMobileScreen(); Console.ReadKey(); } } public interface IMobileScreen { void ProductMobileScreen(); //預設公用方法 } public class AppleMobileScreen : IMobileScreen { public void ProductMobileScreen() { Console.WriteLine("蘋果手機螢幕"); } } public class HuaWeiMobileScreen : IMobileScreen { public void ProductMobileScreen() { Console.WriteLine("華為手機螢幕"); } } public interface IMobileBoard { void ProductMobileBoard(); } public class AppleMobileBoard : IMobileBoard { public void ProductMobileBoard() { Console.WriteLine("蘋果手機主機板"); } } public class HuaWeiMobileBoard : IMobileBoard { public void ProductMobileBoard() { Console.WriteLine("華為手機主機板"); } } public interface IMobileFactory //生產 手機的介面 { IMobileScreen ProductMobileScreen(); IMobileBoard ProductMobileBoard(); } public class ProductHuaWeiMobile : IMobileFactory //生產華為手機的工廠類 { public IMobileBoard ProductMobileBoard() { return new HuaWeiMobileBoard(); } public IMobileScreen ProductMobileScreen() { return new HuaWeiMobileScreen(); } } public class ProductAppleMobile:IMobileFactory//生產蘋果手機的工廠類 { public IMobileBoard ProductMobileBoard() { return new AppleMobileBoard(); } public IMobileScreen ProductMobileScreen() { return new AppleMobileScreen(); } } }View Code
總結:
朋友呀!如果看了程式碼還沒理解這三種設計模式,建議先鞏固一下C#中的面向物件中的多型,繼承等基礎知識或其它面嚮物件語言也可。這幾個例子其實淺顯易懂,只是讓大家理解這種思想。在今後專案實戰中能夠應用使自己的程式更健壯,或見其他人專案中應用到了這種模式能夠快速理解。