1. 程式人生 > WINDOWS開發 >C# 抽象工廠的設計模式

C# 抽象工廠的設計模式

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();
        
public abstract HightFrequenty CreateFrequenty(); } public class ElectricProduction { public int Intitale() { return 0; } } /// <summary> /// 高壓產品 /// </summary> public abstract class HightPower { public abstract
int 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<HightPower> hightPowerProductions = new List<HightPower>();
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();

抽象工廠的優點:

  抽象工廠模式將具體產品的建立延遲到具體工廠的子類中,這樣將物件的建立封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴充套件,這真是抽象工廠模式的優點所在,然後抽象模式同時也存在不足的地方;

缺點:

抽象工廠模式很難支援新種類產品的變化。這是因為抽象工廠介面中已經確定了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。

知道了抽象工廠的優缺點之後,也就能很好地把握什麼情況下考慮使用抽象工廠模式了,下面就具體看看使用抽象工廠模式的系統應該符合那幾個前提:

  • 一個系統不要求依賴產品類例項如何被建立、組合和表達的表達,這點也是所有工廠模式應用的前提。
  • 這個系統有多個系列產品,而系統中只消費其中某一系列產品
  • 系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。