動機:在軟件系統中,經常面臨着“系列相互依賴的對象”的創建工作:同時,由於需求的變化,往往存在更多系列對象 的創建工作;如何應對這種變化?如何繞過常規的對象創建方法(new),提供一種“封裝機制”來避免客戶程序和這種“多系列具體對象創建工作”的緊耦合?
意圖:提供一個接口,讓該接口負責創建一系列“相關或者相互依賴的對象”,無需指定它們具體的類。
適用性:
一個系統要獨立於它的產品的創建、組合和表示時。 一個系統要由多個產品系列中的一個來配置時。 當你要強調一系列相關的產品對象的設計以便進行聯合使用時。 當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。UML圖:
示例代碼:遊戲場景中AbstractFactory模式的應用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AbstractFactory
{
#region 一系列對象的抽象類定義
/// <summary>
/// 路(抽象類)
/// </summary>
public abstract class Road
{
}
/// <summary>
/// 房屋(抽象類)
/// </summary>
public abstract class Building
{
}
/// <summary>
/// 隧道(抽象類)
/// </summary>
public abstract class Tunnel
{
}
/// <summary>
/// 叢林(抽象類)
/// </summary>
public abstract class Jungle
{
}
#endregion
#region 一系列具體實例對象類的定義
#region 現代風格的一系列對象
/// <summary>
/// 現代風格的路
/// </summary>
public class ModernRoad:Road
{
}
/// <summary>
/// 現代風格的房屋
/// </summary>
public class ModernBuilding:Building
{
}
/// <summary>
/// 現代風格的隧道
/// </summary>
public class ModernTunnel:Tunnel
{
}
/// <summary>
/// 現代風格的叢林
/// </summary>
public class ModernJungle:Jungle
{
}
#endregion
#region 古代風格的一系列類
/// <summary>
/// 古老風格的路
/// </summary>
public class AncientRoad : Road
{
}
/// <summary>
/// 古老風格的房屋
/// </summary>
public class AncientBuilding : Building
{
}
/// <summary>
/// 古老風格的隧道
/// </summary>
public class AncientTunnel : Tunnel
{
}
/// <summary>
/// 古老風格的叢林
/// </summary>
public class AncientJungle : Jungle
{
}
#endregion
#endregion
/// <summary>
/// 場景設施抽象創建工廠類
/// </summary>
public abstract class FacilitiesFactory
{
public abstract Road CreateRoad();
public abstract Building CreateBuilding();
public abstract Tunnel CreateTunnel();
public abstract Jungle CreateJungle();
}
/// <summary>
/// 現代風格的對象創建工廠類
/// </summary>
public class ModernFacilitiesFactory : FacilitiesFactory
{
public override Road CreateRoad()
{
return new ModernRoad();
}
public override Building CreateBuilding()
{
return new ModernBuilding();
}
public override Tunnel CreateTunnel()
{
return new ModernTunnel();
}
public override Jungle CreateJungle()
{
return new ModernJungle();
}
}
/// <summary>
/// 古代風格的對象創建工廠類
/// </summary>
public class AncientFacilitiesFactory : FacilitiesFactory
{
public override Road CreateRoad()
{
return new AncientRoad();
}
public override Building CreateBuilding()
{
return new AncientBuilding();
}
public override Tunnel CreateTunnel()
{
return new AncientTunnel();
}
public override Jungle CreateJungle()
{
return new AncientJungle();
}
}
/// <summary>
/// 假設此類爲客戶程序
/// </summary>
public class GameManager
{
/***
* 當需要增加另一種風格的場景時,只需要繼承對應的抽象類實現此風格下的實例對象類和具體工廠類即可
* 而客戶程序無需改動或改動甚少,這既是這種設計模式的優勢
* ***/
FacilitiesFactory _facilitiesfactory;
Road road;
Building building;
Tunnel tunnel;
Jungle jungle;
public GameManager(FacilitiesFactory facilitiesfactory )
{
this._facilitiesfactory = facilitiesfactory;
}
/// <summary>
/// 創建遊戲場景
/// </summary>
public void BuildGameFacilities()
{
road = _facilitiesfactory.CreateRoad();
building = _facilitiesfactory.CreateBuilding();
tunnel = _facilitiesfactory.CreateTunnel();
jungle = _facilitiesfactory.CreateJungle();
}
/// <summary>
/// 開始遊戲
/// </summary>
public void Play()
{
}
}
}
客戶程序調用:
public class App
{
public static void Main()
{
FacilitiesFactory ff = new ModernFacilitiesFactory();
GameManager game = new GameManager(ff);
game.BuildGameFacilities();
game.Play();
}
}
注:本示例代碼是本人學習Webcast C#面向對象設計模式縱橫談系列講座視頻時,跟着李建忠老師一步一步的編寫的
,在此奉獻出來,僅供大家參考