factory method --- 工廠方法
從耦合關係談起
耦合關係直接決定著軟體面對變化時的行為
--模組與模組之間的緊耦合使得軟體面對變化時,相關的模組都要隨之更改
--模組與模組之間的松耦合使得軟體面對變化時,一些模組更容易被替換或者更改,但其他模組保持不變
軟體需求的變化不應該是工程師抱怨的問題,而應該是工程師要解決的問題
主要的部分---抽象的高層部分---變化慢
細節的部分---具體的實現部分---變化快
細節依賴於主幹
動機(motivation)
在軟體系統中,經常面臨著"某個物件"的建立工作;由於需求的變化,這個物件具體實現經常面臨著劇烈的變化,但是它卻擁有比較穩定的介面。
如何應對這種變化?如何提供一種"封裝機制"來隔離出"這個易變物件"的變化,從而保持系統中"其他依賴該物件的物件"不隨著需求改變而改變?
意圖(intent)
定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。factory method使得乙個類的例項化延遲到子類。
結構
static
void
main(
string
args)
汽車模型
abstract
class
abstractcar
abstract
class
ca***ctory
--- 測試不同型別的abstractcar
class
cartestframwork
public
void
dotest(abstractcar car)
public
testdata gettestdata(abstractcar car)}//
hongqicar.cs
public
class
hongqicar : abstractcar
public
override
void
run(){}
public
override
void
trun(direction direction{}
public
override
void
stop(){}
}class
hongqica***ctory : ca***ctory}//
dongfengcar.cs --- 擴充套件,而不更改原來的結構
public
class
dongfengcar : abstractcar
public
override
void
run(){}
public
override
void
trun(direction direction{}
public
override
void
stop(){}
}class
dongfengca***ctory : ca***ctory}
factory method 應用於我在業務**中需要n個car()例項作為引數,而n又不確定,所以不能用傳入的方法,這樣子的話,n=3時我就得在業務邏輯之前加上
car c1 = new car();
car c2 = new car();
car c3 = new car();
但是n=5時呢?
所以我們在定義了乙個ca***ctory去管理例項的生成,這個的實現可以參考singleton模式的應用
factory method模式的幾個要點
·factory method模式主要用於隔離類物件的使用者和具體型別之間的耦合關係。面對乙個經常變化的具體型別,緊耦合關係會導致軟體的脆弱。
·factory method模式通過物件導向的手法,將所要建立的具體物件工作延遲到子類,從而實現一種擴充套件(而非更改)的策略,較好地解決了這種緊耦合的關係。
·factory method模式解決"單個物件"的需求變化,abstract factory模式解決"系列物件"的需求變化,builder模式解決"物件部分"的需求變化。
工廠模式(Factory Method
意圖 工廠方法模式 factory method pattern 工廠方法模式又稱為 工廠模式 也叫虛擬構造器 virtual constructor 模式或者 多型模式 屬於類的建立型模式。在工廠方法模式中,父類負責定義建立物件 的公共介面,而子類則負責生成具體的物件,這樣做的目的是將類的例項化操...
Factory Method(工廠模式)
定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。將產品的 實現 從 使用 中解耦 1.當乙個類不知道它所必須建立的物件的類的時候 2.當乙個類希望由它的子類來指定它所建立的物件的時候 3.當想將建立物件的職責委託給多個幫助子類中的某乙個,並且希望將哪乙個幫...
工廠方法(Factory Method)
為建立的物件定義乙個抽象類,雖然該抽象類負責建立物件,但由它的實現類決定哪個類需要例項化。即不在由單個工廠類決定應該例項化哪個子類。工廠類會將這決定推遲到每個子類中完成。product page 定義乙個由工廠方法例項化的物件介面。concreteproduct skillspage,educati...