提供一個介面,讓該介面負責建立一系列"相關或者相互依賴的對象",無需指定它們具體的類。
在軟體系統中,經常面臨著"一系列相互依賴的對象"的建立工作;同時,由於需求的變化,往往存在更多系列對象的建立工作。
如何應對這種變化?如何繞過常規的對象建立方法(new),提供一種"封裝機制"來避免客戶程式和這種"多系列具體對象建立工作"的緊耦合?
哪裡變化,封裝哪裡。(如果沒有變化,當然不需要額外的封裝)
Abstract Factory 抽象原廠模式
public abstract class Road { }
public abstract class Building { }
public class ClassicRoad : Road { }
public class ClassicBuilding : Building { }
public class ModernRoad : Road { }
public class ModernBuilding : Building { }
public abstract class FacilitiesFactory
{
public abstract Road CreateRoad();
public abstract Building CreateBuilding();
}
public class ClassicFacilitiesFactory : FacilitiesFactory
{
public override Road CreateRoad()
{
return new ClassicRoad();
}
public override Building CreateBuilding()
{
return new ClassicBuilding();
}
}
public class ModernFacilitiesFactory : FacilitiesFactory
{
public override Road CreateRoad()
{
return new ModernRoad();
}
public override Building CreateBuilding()
{
return new ModernBuilding();
}
}
class GameManager
{
FacilitiesFactory facilitiesFactory;
Road road;
Building building;
public GameManager(FacilitiesFactory facilitiesFactory)
{
this.facilitiesFactory = facilitiesFactory;
}
public void BuildGameFacilities()
{
road = facilitiesFactory.CreateRoad();
building = facilitiesFactory.CreateBuilding();
}
public void Play()
{
road.AAA();
building.BBB(road);
}
}
class App
{
public static void Main()
{
GameManager manager = new GameManager(new ClassicFacilitiesFactory());
manager.BuildGameFacilities();
manager.Play();
}
}
要點:
1、如果沒有應對“多系列對象構建”的需求變化,則沒有必要使用Abstract Factory模式,這時候使用簡單的靜態工廠完全可以;
2、“系統對象”指的是這些對象之間有相互依賴、或作用的關係,例如遊戲開發情境中的“道路”與“房屋”的依賴,“道路”與“地產”的依賴。
3、Abstract Factory模式主要在於應對“新系列”的需求變動。其缺點在於難以對“新對象”的需求變動。
4、Abstract Factory模式經常和Factory Method模式共同組合來應對“對象建立”的需求變化。