3、假設一個遊戲開發場景:
咱們須要構造「道路」、「房屋」,「地道」、「叢林」等對象,咱們須要創建一系列對象,這些對象相互依賴
Road road = roadFactory.CreateRoad();
...
Building building = roadFactory.CreateBuilding();
...
以上代碼相對穩定
class RoadFactory{
public static Road CreateRoad(){
return new Road(); //建立道路
}
public static Building CreateBuilding(){
return new Building();//建立房屋
}
public static Tunnel CreateTunnel(){
return new Tunnel(); //建立地道
}
public static Jungle CreateJungle(){
return new Jungle(); // 建立叢林
}
}
純靜態的方法很差,上述代碼若是需求改變,它多是變化點
4、簡單工廠的問題
不能應對「不一樣系列對象」的變化。好比有不一樣風格的,遊戲場景——對應不一樣風格的道路、房屋、地道、叢林等
如何應對這種變化,如何解決: 使用面嚮對象的技術來「封裝」變化點。
5、動機(Motivation)
在軟件系統中,常常面臨着「一系列相互依賴的對象」的建立工做;同時,因爲需求的變化,每每存在更多系列對象的建立工做。
如何應對這種變化?如何繞過常規的對象建立方法(new),提供一種「封裝機制」來避名免客戶程序和這種「多系列具體對象建立工做」的緊耦合?
6、意圖(Intent)
提供一個接口,讓該接口負責建立一系列「相關或者相互依賴的對象」,無需指定它們具體的類。
7、具體實現
//道路
public abstract class Road
{
}
//房屋
public abstract class Building
{
}
//地道
public abstract class Tunnel
{
}
//叢林
public abstract class Jungle
{
}web
// 第一種風格的設施:現代風格
//道路
public class ModernRoad : Road
{
}
//房屋
public class ModernBuilding : Building
{
}
//地道
public class ModernTunnel : Tunnel
{
}
//叢林
public class ModernJungle : Jungle
{
}編程
//抽像工廠:設施工廠
abstract class FacilitiesFactory
{
public abstract Road CreateRoad();
public abstract Building CreateBuilding();
public abstract Tunnel CreateTunnel();
public abstract Jungle CreateJungle();
}ide
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();
}
}ui
客戶程序:整個診賴於抽象工廠,沒有依賴具體的實現,咱們的目的是須要GameManager類穩定下來,不須要變更。
class GameManager
{
private FacilitiesFactory facilitiesFactory;
private Road road;
private Building building;
private Tunnel tunnel;
private Jungle jungle;
public GameManager(FacilitiesFactory facilitiesFactory)
{
this.facilitiesFactory = facilitiesFactory;
}
public void BuildGameGameFacilities()
{
road = facilitiesFactory.CreateRoad();
building = facilitiesFactory.CreateBuilding();
tunnel = facilitiesFactory.CreateTunnel();
jungle = facilitiesFactory.CreateJungle();
//若是設施變化劇烈,這裏抽象工廠就是誤用,變化劇烈的應該是這些設施的風格
}
public void Run()
{
road.A();
building.B(road);
tungle.C();
jungle.D();
}
}this
class App
{
public static void Main()
{
//只需改這裏就行,須要什麼風格就new什麼風格,這裏運行現代風格new ModernFacilitiesFactory()
FacilitiesFactory facilitiesFactory = new ModernFacilitiesFactory()
//能夠從web.config文件中設置相關,利用.net的反射獲得特定風格的工廠
GameManger gm = new GameManager(facilitiesFactory);
gm.BuildGameGameFacilities();
gm.Run();
}
}.net
8、Abstract Factory模式的幾個要點
1)若是沒有應對「多系列對象構建」的需求變化,則沒有必要使用抽像工廠模式,這時候使用簡單的靜態工廠徹底能夠。
2)「系列對象」指的是這些對象之間有相互依賴、或做用的關係,例如遊戲開發場景中的「道路」的依賴,「道路」與「地道」的依賴。
3)抽像工廠模式主要在於應對「新系列」的需求變更。其缺點在於難以應對「新對象」的需求變更。
4)抽像工廠模式常常和工廠方法模式共同組合來應對「對象建立」的需求變化。對象