小白設計模式入門(4)—— 抽象工廠模式
阿新 • • 發佈:2018-12-12
一、引言
從簡單工廠模式->工廠模式->抽象工廠模式,都是為了克服之前的一些缺點而設計的。工廠方法模式具有很好的可擴充套件性,但是一個工廠只建立單個產品這樣的例子很少,常常需要建立多個系列的產品。抽象工廠能很好地解決一系列產品建立的問題。
二、實現示例
抽象工廠示例
#region 自己寫的抽象工廠
/// <summary>
/// 抽象工廠,將所有裝置抽象出來
/// </summary>
public interface IEquipAbstractFactory
{
ICamera CreateCamera ();
IRadar CreateRadar();
}
/// <summary>
/// 攝像頭介面
/// </summary>
public interface ICamera : IEquip
{
new string GetName();
}
/// <summary>
/// 衛星定位裝置介面
/// </summary>
public interface IRadar : IEquip
{
new string GetName ();
}
/// <summary>
/// 第一個航行器
/// </summary>
public class FirstVehicleFactory: IEquipAbstractFactory
{
public ICamera CreateCamera()
{
return new HikVision();
}
public IRadar CreateRadar()
{
return new LaserRadar ();
}
}
public class HikVision: ICamera
{
public string GetName()
{
return nameof(HikVision);
}
}
public class LaserRadar : IRadar
{
public string GetName()
{
return nameof(LaserRadar);
}
}
#endregion
新增工廠
/// <summary>
/// 現在增加第二個航行器
/// </summary>
public class SecondVehicleFactory : IEquipAbstractFactory
{
public ICamera CreateCamera()
{
return new Uniview();
}
public IRadar CreateRadar()
{
return new MillimeterWaveRadar();
}
}
public class Uniview : ICamera
{
public string GetName()
{
return nameof(Uniview);
}
}
public class MillimeterWaveRadar : IRadar
{
public string GetName()
{
return nameof(MillimeterWaveRadar);
}
}
呼叫示例
public class AbstractFactoryClient
{
public static void Test()
{
IEquipAbstractFactory e1 = new FirstVehicleFactory();
var c1 = e1.CreateCamera();
var r1 = e1.CreateRadar();
string tmp = "";
tmp = c1.GetName();
Console.WriteLine(tmp);
tmp = r1.GetName();
Console.WriteLine(tmp);
IEquipAbstractFactory e2 = new SecondVehicleFactory();
var c2 = e2.CreateCamera();
var r2 = e2.CreateRadar();
tmp = c2.GetName();
Console.WriteLine(tmp);
tmp = r2.GetName();
Console.WriteLine(tmp);
}
}
三、分析
優點: 抽象工廠模式將具體產品的建立延遲到具體工廠的子類中,這樣將物件的建立封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴充套件
缺點: 抽象工廠模式很難支援新種類產品的變化。這是因為抽象工廠介面中已經確定了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。
場景(前提):
- 1、一個系統不要求依賴產品類例項如何被建立、組合和表達的表達,這點也是所有工廠模式應用的前提。
- 2、這個系統有多個系列產品,而系統中只消費其中某一系列產品
- 3、系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。