C# 抽象工廠的設計模式
阿新 • • 發佈:2020-05-06
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FactoryMode { public abstract class NewAbstractFactory { public abstract HightPower CreateHightProduct(); public abstract LowPower CreateLowProduct();客戶端使用: List<HightPower> hightPowerProductions = new List<HightPower>();public abstract HightFrequenty CreateFrequenty(); } public class ElectricProduction { public int Intitale() { return 0; } } /// <summary> /// 高壓產品 /// </summary> public abstract class HightPower { public abstractint Open(); public abstract void ProductSerialNum(string strSerial); } /// <summary> /// 低壓產品 /// </summary> public abstract class LowPower { public abstract int Open(); public abstract void ProductSerialNum(string strSerial); } /// <summary>/// 高頻產品 /// </summary> public abstract class HightFrequenty { public abstract int Open(); public abstract void ProductSerialNum(string strSerial); } //+++++++++++++++++++++++++++++++ //實際需求產品工廠 public class ABBFactory : NewAbstractFactory { public override HightFrequenty CreateFrequenty() { throw new NotImplementedException(); } public override HightPower CreateHightProduct() { return new ABBHightPower(); } public override LowPower CreateLowProduct() { return new ABBLowPower(); } } public class SiemensFactory : NewAbstractFactory { public override HightFrequenty CreateFrequenty() { throw new NotImplementedException(); } public override HightPower CreateHightProduct() { return new SiemensHightPower(); } public override LowPower CreateLowProduct() { return new SiemensLowPower(); } } //+++++++++++++++++++++++++++++++ /// <summary> /// ABB高壓產品 /// </summary> public class ABBHightPower : HightPower { string _strProductSerial = ""; public override int Open() { Console.WriteLine(_strProductSerial); return 0; } public override void ProductSerialNum(string strSerial) { _strProductSerial = strSerial; } } /// <summary> /// ABB低壓產品 /// </summary> public class ABBLowPower :LowPower { string _strProductSerial = ""; public override int Open() { Console.WriteLine(_strProductSerial); return 0; } public override void ProductSerialNum(string strSerial) { _strProductSerial = strSerial; } } /// <summary> /// 西門子高壓產品 /// </summary> public class SiemensHightPower : HightPower { string _strProductSerial = ""; public override int Open() { Console.WriteLine(_strProductSerial); return 0; } public override void ProductSerialNum(string strSerial) { _strProductSerial = strSerial; } } /// <summary> /// 西門子低壓產品 /// </summary> public class SiemensLowPower : LowPower { string _strProductSerial = ""; public override int Open() { Console.WriteLine(_strProductSerial); return 0; } public override void ProductSerialNum(string strSerial) { _strProductSerial = strSerial; } } }
List<LowPower> lowPowerProductions = new List<LowPower>();
//+++++++++++++++++++++++
ABBFactory aBBFactory = new ABBFactory();
SiemensFactory siemensFactory = new SiemensFactory();
hightPowerProductions.Add(aBBFactory.CreateHightProduct());
hightPowerProductions.Add(siemensFactory.CreateHightProduct()); lowPowerProductions.Add(aBBFactory.CreateLowProduct());
lowPowerProductions.Add(siemensFactory.CreateLowProduct());
lowPowerProductions[0].ProductSerialNum(""); Console.ReadKey();
抽象工廠的優點:
抽象工廠模式將具體產品的建立延遲到具體工廠的子類中,這樣將物件的建立封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴充套件,這真是抽象工廠模式的優點所在,然後抽象模式同時也存在不足的地方;
缺點:
抽象工廠模式很難支援新種類產品的變化。這是因為抽象工廠介面中已經確定了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。
知道了抽象工廠的優缺點之後,也就能很好地把握什麼情況下考慮使用抽象工廠模式了,下面就具體看看使用抽象工廠模式的系統應該符合那幾個前提:
- 一個系統不要求依賴產品類例項如何被建立、組合和表達的表達,這點也是所有工廠模式應用的前提。
- 這個系統有多個系列產品,而系統中只消費其中某一系列產品
- 系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。