在對比兩種模式之前,首先需要學習 開放-封閉原則。在以前學習的過程中,聽說過很多次,編寫程式要遵循開閉原則。
在做專案的過程中,因為需求的新增,經常會更新軟體。更新軟體,就要設計到修改**了。在物件導向的程式設計中,經常會寫類。如果因為新增需求,去修改已經完成的類。那麼他是不符合開閉原則的。
新增需求,應該讓**去擴充套件,而不是去修改。通過抽象類和繼承來實現開閉原則。
開閉原則:對於擴充套件是開放的,對於更改是封閉的。
使用開閉原則,可以給物件導向的程式設計帶來巨大的好處,使得**可維護、可擴充套件、可復用、靈活性好。
首先來看一下簡單工廠模式:
實現的**:
public class operation //定義操作類
set
}public double numberb //第二個運算元
set
}public virtual double getresult() //返回執行結果
}public class operationadd : operation //加法類,繼承操作類
}public class operationsub : operation //減法類,繼承操作類
}public class operationmul : operation //乘法類,繼承操作類
}public class operationdiv : operation //除法類,繼承操作類
}public class operationfactory //建立簡單工廠
return oper;}}
通過上面的例子,你會發現,在簡單工廠模式中,如果要增加需求,必須修改的類有
operationfactory
,每次增加需求都需要修改工廠,這樣是既對擴充套件開放,又對修改也開放了。這就就違背了開-
閉原則。
在簡單工廠裡面,不需要管改用哪個類的例項,只需要把
'+'給工廠,工廠自動就給出了相應的實力。客戶端只需要去做運算就可以了。根據不同的例項去實現不同的運算,擴充套件需要修改工廠中的
case
語句。所以違背了開閉原則。
對於工廠模式,根據不同的例項,來對應不同的工廠。對修改進行封閉。如果需要擴充套件,只需要增加相應的工廠類即可。這樣就不需要修改原有的工廠了。
在來看一下工廠模式:
實現的**:
class program
}public class operation //定義操作類
set
}public double numberb //第二個運算元
set
}public virtual double getresult() //得到執行結果
}public class operationadd : operation //加法類,繼承操作類
}public class operationsub : operation //減法類,繼承操作類
}public class operationmul : operation //乘法類,繼承操作類
}public class operationdiv : operation //除法類,繼承操作類
}inte***ce ifactory //建立乙個工廠介面
class addfactory : ifactory //加法類工廠
}class subfactory : ifactory //減法類工廠
}class mulfactory : ifactory //乘法類工廠
}class divfactory : ifactory //除法類工廠
}
對比兩種設計模式,工廠模式是在簡單工廠模式上稍作改進得到的,更優於簡單工廠模式,使得**可維護、可擴充套件、可復用、靈活性好。 簡單工廠和工廠模式
工廠模式 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。factory method使乙個類的例項化延遲到其子類。適用性當乙個類不知道它所必須建立的物件的類的時候。當乙個類希望由它的子類來指定它所建立的物件的時候。當類將建立物件的職責委託給多個幫助子類中的某乙個,並且你希望將哪乙個幫助子類是...
簡單工廠和工廠模式
設計模式泛泛談 想要實現依賴倒轉規則,工廠方法不是唯一的技巧。工廠模式或者抽象工廠應該是重構時使用的。怎麼感覺有點 fp 中的高階函式的味道!簡單工廠和工廠模式的區別 區別其實不大。但是工廠模式能對修改閉合,以前的 保證不會出問題。不會出現新增的功能測試沒問題,已有的功能莫名其妙就掛掉的情況。所以真...
簡單工廠模式和工廠模式見解
簡單工廠模式是23種設計模式的一種,給人最直觀的感受就是我可以根據我輸入的資料建立不同的物件,但是這個物件必須實現相同的方法。那我們可不可以理解成就是乙個物件裡面我重寫了若干個方法,這個方法除了方法體不一樣其他都一樣,貌似這樣理解也沒錯,只是簡單工廠模式將其具體化了。public inte ce o...