工廠方法模式
對比兩個模式
乙個簡單地加減乘除類
結構圖:
只要輸入運算符號,工廠就可以例項化出乙個合適的物件,通過多型,返回父類的方式實現了計算器的結果。
如果需要更改加法運算,直接更改operationadd就可以。
如果增加其他運算,只要增加相應的運運算元類就可以了。
如果需要修改運算類工廠,只需要在switch中增加分支。
簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。
工廠方法模式:
定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類。
結構圖
對於上面的加減乘除的工廠方法
工廠類與分支耦合,根據依賴倒轉原則,把工廠抽象出乙個介面,這個介面只有乙個方法,那就是建立抽象產品的工廠方法,然後,所有的要生產具體類的工廠,就去實現這個介面,這樣,乙個簡單工廠模式的工廠類,就變成了乙個工廠抽象介面和多個具體生成物件的工廠,這樣在增加「求m數的n次方」的功能時,不需要更改原有的工廠類,只需要增加此功能的運算類和相應的工廠類就可以了。這樣比較符合開閉原則
加減乘除的類圖:
存在的問題:
工廠方法模式實現時,客戶端需要決定例項化哪乙個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端**來進行,你想要加功能,本來是改工廠類的,現在是修改客戶端的。
雷鋒工廠
幫助孤寡老人的類叫雷鋒類,雷鋒需要做的是掃地 洗衣 買公尺等活動。雷鋒可以是大學生也可以是社群志願者,但是老人只知道「雷鋒」,所以這裡就讓大學生和社群志願者繼承雷鋒類,來幫助孤寡老人。
雷鋒類
namespace 雷鋒工廠
public
void
wash()
public
void
buyrice()
}}
雷鋒工廠的介面;
//定義乙個雷鋒工廠的介面
//雷鋒工廠
inte***ce
ifactory
學雷鋒的大學生工廠
//學雷鋒的大學生工廠
///
/// 繼承雷鋒工廠的方法
///
class
undergraduatefactory
:ifactory
}
社群志願者工廠:
//社群志願者工廠
class
voluntee***ctory
:ifactory
}
客戶端**:
namespace 雷鋒工廠
}}
工廠方法克服了簡單工廠違背開閉原則的缺點,保持了封裝物件建立過程的優點。他們都是集中封裝了物件的建立,使得要更換物件時,不需要做大的改動就可以實現,降低了客戶程式與產品物件的耦合。
工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多型性,工廠方法模式保持了簡單工廠模式的優點,並且克服了他的優點,但是缺點是由於每加乙個產品,就需要加乙個產品工廠的類,增加了額外的開發量。而且這裡還是修改了客戶端的**。
工廠方法模式Python版 雷鋒依然在人間
工廠方法模式定義了乙個用於建立物件的介面,讓子類決定例項化哪乙個類,factory method使乙個雷的例項化延遲到其子類。工廠方法模式的本質就是延遲到子類來選擇是實現。實現 class operationfactory operators operators operationadd opera...
大話設計模式八 工廠方法模式(雷鋒依然在人間)
工廠方法模式是簡單工廠模式的抽象和擴充套件。工廠方法模式是由客戶端來決定例項化那乙個工廠實現類。在簡單工廠類中如果要增加功能改動的是工廠類,但在工廠方法模式中要改的就是客戶端了,由客戶端決定 package factory public class mainclass private static ...
第八章 雷鋒依然在人間 工廠方法模式 讀書筆記
雷鋒依然在人間 工廠方法模式 1.簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。2.工廠方法模式 factory method 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲...