常規的物件建立方法:
//建立乙個road物件
road road
=new
road();
new 的問題:
實現依賴,不能應對「具體例項化型別」的變化。
解決思路:
封裝變化點-----**變化,封裝**
潛台詞: 如果沒有變化,當然不需要額外的封裝!
工廠模式的緣起
變化點在「物件建立」,因此就封裝「物件建立」
面向介面程式設計----依賴介面,而非依賴實現
最簡單的解決方法:
1class
roadfactory6}
7//建立乙個road物件
8road road
=roadfactory.createroad();
建立一系列相互依賴物件的建立工作:
假設乙個遊戲開場景:
我們需要構造"道路"、"房屋"、"地道","從林"...等等物件
工廠方法如下:
1class
roadfactory27
public
static
building createbuilding()811
public
static
tunnel createtunnel()
1215
public
static
jungle createjungle()
1619
}呼叫方式如下:1
road road
=roadfactory.createroad();
3building building
=roadfactory.createbuilding();
4tunnel tunnel
=roadfactory.createtunnel();
5jungle jungle
=roadfactory.createjungle();
如上可見簡單工廠的問題:
不能應對"不同系列物件"的變化。比如有不同風格的場景---對應不同風格的道路,房屋、地道....
如何解決:
使用物件導向的技術來"封裝"變化點。
動機(motivate):
在軟體系統中,經常面臨著"一系統相互依賴的物件"的建立工作:同時,由於需求的變化,往往存在更多系列物件的建立工作。
如何應對這種變化?如何繞過常規的物件建立方法(new),提供一種"封裝機制"來避免客戶程式和這種"多系列具體物件建立工作"的緊耦合?
意圖(intent):
提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。
----《設計模式》gof
結構圖(struct):
適用性:
1.乙個系統要獨立於它的產品的建立、組合和表示時。
2.乙個系統要由多個產品系統中的乙個來配置時。
3.當你要強調一系列相關的產品物件的設計以便進行聯合使用時。
4.當你提供乙個產品類庫,而只想顯示它們的介面不是實現時。
生活例子:
結構圖**實現:
1abstract
class
abstractfactory21
abstract
class
abstractproducta21
abstract
class
abstractproductb21
class
client210
public
void
run()
1115}1
class
concretefactory1:abstractfactory27
public
override
abstractproductb createproductb()811
}1class
concretefactory2:abstractfactory27
public
override
abstractproductb createproductb()811
}1class
producta1:abstractproducta27
}1class
productb1:abstractproductb27
}1class
prodcuta2:abstractproducta27
}1class
productb2:abstractproductb27
}1public
static
void
main()
2abstract factory注意的幾點:
如果不存在」多系列物件建立「的需求變化,則沒必要應用abstract factory模式,靜態工廠方法足矣。
"系列物件"指的是這些物件之間有相互依賴、或作用的關係。例如遊戲開發場景中的"道路"與"房屋"依賴,「道路」與「地道」的依賴。
abstract factory模式主要在於應對"新系列"的需求變動。其缺點在於難以應對」新物件「的需求變動。
abstract factory模式經常和factory method模式共同組合來應對「物件建立」的需求變化。
抽象工廠模式 抽象工廠模式
抽象工廠模式其實是圍繞了乙個超級工廠建立其他的工廠 可參考工廠模式 這個超級工廠又可以想像成是其他工廠的工廠,這種設計模式是一種建立型模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指出其類。每個生成的工廠都能按照工廠模式提供物件。意圖提供乙個建立一系列相關或相互依賴物件的介面,...
工廠模式 抽象工廠
在看抽象工廠前,我們需要引入兩個概念 1 產品等級結構 2 產品族 我們現在有這樣兩個產品型別 汽車 car 自行車 bike 有兩家公司 寶馬 bmw 奧迪 audi 每乙個廠家都能夠生產這兩種型別的產品 bmw介面 bmwcar,bmwbike audi介面 audicar,audibike 在...
工廠模式 抽象工廠
1 為了提高內聚和松耦合,我們經常會抽象出一些類的公共介面以形成抽象基類或者介面。這樣我們可以通過宣告乙個指向基類的指標來指向實際的子類實現,達到了多型的目的。這裡很容易出現的乙個問題是 若干個子類繼承自抽象基類,我們必須在每次要用到子類的地方就寫如 new 的 這裡帶來兩個問題 1 客戶程式設計師...