new的問題
常規的對象創建方法:
//創建一個對象
Person person = new Person();
new的問題:
-實現依賴,不能應對"具體實例化類型"的變化
解決思路:
-封裝變化點---哪裏變化,封裝哪裏
-潛臺詞:如果沒有變化,當然不需要額外的封裝
工廠模式的緣起
-變化點在"對象創建",因此就封裝"對象創建".
-面向接口編程------依賴接口,而非依賴實現。
最簡單的解決方法
class PersonFactory
{
public static PersonCreateRoad()
{
return new Person();
}
}
//創建一個Person對象
Person person = PersonFactory.PersonCreatRoad();
假設一個遊戲開發場景:
我們需要構造"道路"、"房屋"、"地道"、"叢林"…………等對象
Road road = RoadFactory.CreatRoad();
Building building = RoadFactory.CreatBuilding();
class RoadFactory()
{
//創建道路
public static Road CreatRoad()
{
return new Road();
}
//創建大樓
public static Buliding CreatBuliding()
{
return new Buliding();
}
//創建地道
public static Tunnel CreatTunnel()
{
return new Tunnel();
}
}
簡單工廠的問題:
-不能應對"不同系列對象"的變化。比如有不同風格的遊戲場景----------對應不同風格的道路、房屋、地道……。
如何解決:
-使用面嚮對象的技術來"封裝"變化點。
Abstract Factory模式的幾個要點
-如果沒有應對"多系列對象構建"的需求變化,則沒有必要使用Abstract Factory模式,這時候使用簡單的靜態工廠完全可以。
-"系列對象"指的是這些對性愛那個之間有相互依賴、或作用的關係,例如遊戲開發場景中的"道路"與"房屋"的依賴,"道路"和"地道"的依賴。
-Abstract Factory 模式主要在於應對"新系列"的需求變動。其缺點在於難以應對"新對象"的需求變動。
-Abstract Factory 模式經常和Factory Method模式共同組合來應對"對象創建"的需求變化。