《設計模式》從Simple看SimpleFactory的演變

從Simple看SimpleFactory的演變

以《大話設計模式》書爲參考,Simple指的是書中第6-7頁的代碼實例,SimpleFactory(簡單工廠)指的是書中第9-11頁的代碼實例。

以下內容從不同的角度去對比Simple和SimpleFactory的代碼差別以及編程思想上的變化。

爲什麼要用面向對象三要素來理解設計模式?

面向對象和設計模式,都是從生活中抽象來的(面向對象:一切萬物皆對象;設計模式借鑑於建築工程建設模式),面向對象是生活抽象的基礎組件,設計模式是對面向對象(封裝、繼承、多態)的應用。

封裝

Simple SimpleFactory
根據加減乘除四個業務邏輯代碼,封裝到了一個方法中,具體代碼表示如下:Operation類的GetResult方法
Snipaste_2020-03-25_15-01-02.jpg
根據加減乘除四個業務邏輯代碼,抽象出一個Operation類,把不變的部分封裝成類,具體代碼表示如下:
Snipaste_2020-03-25_15-00-09.jpg

總結:封裝解耦合
當需要擴充業務的時候,由於Simple中“加減乘除”業務邏輯代碼的強耦合,會使得任何代碼改動都將嚴重影響其他業務邏輯代碼
而在SimpleFactory中由於抽象出來一個運算類,使得“加減乘除”業務邏輯分別可以被封裝到不同的類中,消滅了“加減乘除”業務邏輯代碼相互之間的耦合。
也就是通過(抽象)封裝,儘量將固定不變的東西封裝起來,將變化隔離在外。


繼承

Simple SimpleFactory
Simple中是沒有繼承的,它是爲了更好的複用加減乘除業務邏輯,把邏輯封裝到了Operation類的GetResult方法中。 SimpleFactory中充分的體現了OOP的繼承思想,主要代碼如下:
運算類Operation爲基(父)類,OperationAdd等分別繼承Operation類,爲子類。

總結:通過新增子類來應對新增業務需求
通過對比,SimpleFactory的“加減乘除”運算子類分別在重寫自己的GetResult方法來實現各自不同的業務邏輯。
如果新增一個業務,可以通過新增一個運算子類來實現,具體新增的業務邏輯代碼只需要寫在新增運算子類的GetResult方法中,對其他已有的“加減乘除”業務邏輯代碼沒有干擾。


多態

Simple SimpleFactory
非常豐富

詳細對比過程如下:
在SimpleFactory中多態的體現,由以下幾點組成:
1. createOperate方法返回類型爲父類Operation類。
2. createOperate方法中的第一行代碼定義了一個Operation對象 oper,即:
Operation oper = null;
oper對象在createOperate方法的最後一行被返回。
3. createOperate方法中,根據傳入的operate參數不同,來實例化不同的運算類對象,如下:
case “+”:
//直接體現多態思想的就是這行代碼。
oper = new OperationAdd();
//根據業務不同,實例化不同的運算子類後賦值給父類實例oper,並被返回給方法調用方。


簡單運算工廠類代碼,如下:

在這裏插入圖片描述
總結:多態的精妙之處在於再一次的將“不變”的東西“封裝”起來。具體代碼展示如下:
1. createOperate方法的返回類型爲父類Operation類,Operation類是封裝好,基本不變的東西。
2. Operation oper = null;
Return oper;
在createOperate方法中首尾兩行代碼,是基本不變的。
3. createOperate方法中應對變化的部分,就是Switch case,變化意味着“風險”,解決的辦法就是繼續解耦合,去掉這種變化的代碼。

將“變化”隔離開

以上部分,從OO(面向對象)的三要素入手,分析了在封裝、繼承、多態方面,Simple和SimpleFactory的差異,通過對比這些差異,能夠看出SimpleFactory的編程思想上有一個非常大的優勢,那就是發現了最初在Simple中的“加減乘除”運算的邏輯代碼(強耦合)中新增業務邏輯代碼會給Simple帶來災難性的新問題。(因爲“加減乘除”代碼之間存在強耦合,所以擴展會帶來代碼的不穩定)。

SimpleFactory 的編程思路一直都是在想辦法抽象出來固定不變的東西,進而來支持變化。

很顯然,在SimpleFactory已經通過新增Operation子類來實現新業務擴展,但在OperationFactory類的createOperate方法中依然存在Operation子類之間的耦合(相比Simple而言,這裏的耦合性弱很多),switch case的這種耦合結構對業務擴展帶來的代碼變化,依然意味着“變化和風險”,還需要進一步的把這部分“變化和風險”隔離到OperationFactory類的外面去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章