1、new的問題ide
常規的對象建立方法:ui
//
建立一個Road對象
Road road =
new Road();
new的問題:this
1)實現依賴,不能應對「具體實例化類型」的變化spa
解決思路:code
1)封裝變化點——哪裏有變化,就封裝哪裏對象
2)潛臺詞:若是沒有變化 ,固然不須要額外的封裝blog
2、工廠模式的緣起接口
1)變化點在「對象建立」,所以就封裝「對象建立」遊戲
2)面向接口編得不到——依賴接口,而非依賴實現ci
3)最簡單的解決方法:
class RoadFactory
{
public
static Road CreateRoad()
{
return
new Road();
}
}
class Program
{
public
static
void Main(
string[] args)
{
//
建立一個Road對象
Road road = RoadFactory.CreateRoad();
}
}
3、建立一系列相互依賴的對象
假設一個遊戲開發場景:
咱們須要構造「道路」、「房屋」、「地道」、「叢林」...等等對象
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();
}
}
class Program
{
public
static
void Main(
string[] args)
{
//
建立一個Road對象
Road road = RoadFactory.CreateRoad();
Building building = RoadFactory.CreateBuilding();
....
}
}
4、簡單工廠的問題
問題:
不能應對「不一樣系列對象」的變化。好比有不一樣風格的遊戲場景——對應不一樣風格的道路、房屋、地道...
解決:
使得面嚮對象的技術來「封裝」變化點
5、動機(Motivation)
在軟件系統中,常常面臨着「一系列相互依賴的對象」的建立工做;同時、因爲需求的變化,每每存在更多系列對象的建立工做。
如何應對這種變化?
如何繞過常規的對象建立方法(new),提供一種「封裝機制」來避免客戶程序和這種「多系統具體對象建立工做」的緊耦合?
6、意圖(Intent)
提供一個接口,讓該接口負責建立一系列「相關或者相互依賴的對象」,無需指定它們具體的類。
7、結構(Structure)
8、代碼示例
public
class Program
{
public
static
void Main(
string[] args)
{
GameManager gameManager =
new GameManager(
new ModernFacilitiesFactory());
gameManager.BulidGameFacilities();
gameManager.Run();
}
}
//
道路
public
abstract
class Road
{
}
//
房屋
public
abstract
class Building
{
}
//
地道
public
abstract
class Tunnel
{
}
//
叢林
public
abstract
class Jungle
{
}
//
設施
abstract
class FacilitiesFactory
{
//
建立道路
public
abstract Road CreateRoad();
//
建立房屋
public
abstract Building CreateBuilding();
//
建立地道
public
abstract Tunnel CreateTunnel();
//
建立叢林
public
abstract Jungle CreateJungle();
}
//
客戶程序
public
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 BulidGameFacilities()
{
road = facilitiesFactory.CreateRoad();
building = facilitiesFactory.CreateBuilding();
tunnel = facilitiesFactory.CreateTunnel();
jungle = facilitiesFactory.CreateJungle();
}
public
void Run()
{
}
}
//
道路
public
class ModernRoad : Road
{
}
//
房屋
public
class ModernBuilding : Building
{
}
//
地道
public
class ModernTunnel : Tunnel
{
}
//
叢林
public
class ModernJungle : Jungle
{
}
//
設施
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();
}
}
10、Abstract Factory模式的幾個要點
1)若是沒有應對「多系列對象構建」的需求變化,則沒有必要使用Abstract Factory模式,這時侯使用簡單的靜態工廠徹底能夠。
2)「系列對象」指的是這些對象之間有相互依賴、或做用的關係,例如遊戲開發場景中的「道路」與「房屋」 的依賴,「道路」與「地道」的依賴。
3)Abstract Factory模式主要在於應對「新系列」的需求變更。其缺點在於難以應付「新對象」的需求變更。
4)Abstract Factory模式常常和Factory Method模式共同組合來應對「對象建立」的需求變化。