Abstract Factory抽象工廠(建立型模式)
阿新 • • 發佈:2019-01-24
提供一個介面,讓該介面負責建立一系列“相關或者相互依賴的物件”,無需制定它們具體的類。 –《設計模式》 GoF
a.new的問題
- 常規的物件建立方法:
// 建立一個Road物件
Road road = new Road();
- new的問題:實現依賴,不能應對“具體例項化型別”的變化。
- 解決思路
封裝變化點–哪裡變化,封裝哪裡。
潛臺詞:如果沒有變化,當然不需要額外的封裝。
工廠模式的緣起
- 變化點在“物件建立”,因此就封裝“物件建立”。
- 面向物件程式設計–依賴介面,而非依賴實現。
- 最簡單的解決方法
class RoadFactory
{
public static Road CreateRoad()
{
return new Road();
}
}
// 建立一個Road物件
Road road = roadFactory.CreateRoad();
工廠模式動機
- 在軟體系統中,經常面臨著“一系列相互依賴的物件”的建立工作;
- 同時,由於需求的變化,往往存在更多系列物件的建立工作。
程式碼例項
/// <summary>
/// 道路
/// </summary>
abstract class Road
{ }
/// <summary>
/// 建築
/// </summary>
abstract class Building
{ }
/// <summary>
/// 地道
/// </summary>
abstract class Tunnel
{ }
/// <summary>
/// 叢林
/// </summary>
abstract class Jungle
{ }
abstract class FacilitiesFactory
{
public abstract Road CreateRoad();
public abstract Building CreateBuilding();
public abstract Tunnel CreateTunnel();
public abstract Jungle CreateJungle();
}
/// <summary>
/// 客戶程式
/// </summary>
class GameManager
{
FacilitiesFactory facilitiesFactory;
public GameManager(FacilitiesFactory facilitiesFactory)
{
this.facilitiesFactory = facilitiesFactory;
}
public void BuildGameFacilities()
{
Road road = facilitiesFactory.CreateRoad();
Building building = facilitiesFactory.CreateBuilding();
Tunnel tunnel = facilitiesFactory.CreateTunnel();
Jungle jungle = facilitiesFactory.CreateJungle();
}
}
Abstract Factory模式的幾個要點
- 如果沒有應對“多系列物件構建”的需求變化,則沒有必要使用Abstract Factory模式,這時候使用簡單的靜態工廠完全可以。
- “系列物件”指的是這些物件之間存在相互依賴或作用的關係,例如遊戲開發場景中的“道路”與“房屋”的依賴,“道路”與“地道”的依賴。
- Abstract Factory模式主要在於應對“新系列”的需求變化。其缺點在於難易應對“新物件”的需求變動。
- Abstract Factory模式經常和Factory Method模式共同組合來應對“物件建立”的需求變化。