1. 程式人生 > >Abstract Factory抽象工廠(建立型模式)

Abstract Factory抽象工廠(建立型模式)

提供一個介面,讓該介面負責建立一系列“相關或者相互依賴的物件”,無需制定它們具體的類。 –《設計模式》 GoF

Abstract Factory

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模式共同組合來應對“物件建立”的需求變化。