再回首,策略 簡單工廠是否依然?

2021-06-26 14:53:05 字數 2215 閱讀 9067

​這篇部落格是好久之前就打好的草稿,可是一直就拖到了現在,剛好在保定上課,筆記本也排不上大用場,翻看手機,終於撿起了這些草稿,決定寫完。

再說設計模式之前,我們先說說開閉原則。

​以前讀這些官方解釋,總是覺得很官方,現在在讀,覺得句句經典。和大家共享

​遵循開閉原則設計出的模組具有兩個主要特點:

​(1)對於擴充套件是開放的(open for extension)。這意味著模組的行為是可以擴充套件的。當應用的需求改變時,我們可以對模組進行擴充套件,使其具有滿足那些改變的新行為。也就是說,我們可以增加模組的功能。

​(2)對於修改是關閉的(closed for modification)。對模組行為進行擴充套件時,不必改動模組的源**或者二進位制**。模組的二進位制可執行版本,無論是可鏈結的庫、dll或者.exe檔案,都無需改動。

​注意:開閉原則是針對乙個模組來說的,不然,開閉毫無意義。

​這兩個模式是我們容易混淆的,因為從類圖是看,基本是一樣的。以前部落格中都已經介紹過這幾個設計模式,這裡不做詳細介紹,這篇部落格是最近翻看筆記時的一點感觸,來說說這兩個設計模式的不同。

1、問題域不同

​首先看一下兩個模式的定義:

​策略模式

​策略模式(strategy):它定義了一系列的演算法,並將每乙個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法的變化不會影響到使用演算法的客戶。

簡單工廠

簡單工廠模式(****** factory pattern)屬於類的創新型模式,又叫靜態工廠方法模式(static factorymethod pattern),是通過專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

最主要區別是就是:策略模式為行為型設計模式,而簡單工廠為建立型模式。兩個設計模式解決的問題域本就不同,側重點不一樣,放開眼界,學習這兩個模式,不可一起咬住不放。

​2、開閉原則​

策略模式的​特點:建立,選擇不同策略的責任在客戶端。

​如果有擴充套件著怎麼辦呢?需要如下變動:

​    ​1:策略端增加新的策略類,無需改動已有的策略端**————開閉原則

​    ​2:介面增加新策略字串,客戶端進行呼叫修改————客戶端是無論如何都是要進行修改的。

那麼我看簡單工廠的特點:選擇,建立的責任在演算法端

​所以如有擴充套件,需要如下變動:

​    ​1:演算法端增加新的演算法類,呼叫演算法的修改 還在 演算法端,需要改動兩處————違反開閉原則

​    ​2:客戶介面增加選擇新的演算法的字串————客戶端是必定要修改的

這就是區別二,乙個遵循了開閉原則,乙個沒有。還有一點就是,並不是不遵循開閉原則就一定不好,具體還是要看需求,具體對待。

巨集觀上問題域不同,細節上,是否需要遵循開閉原則,​這兩點足以讓我們可以適時的選擇清楚簡單工廠和策略模式了。​

三、策略 同 簡單工廠

兩個模式不考慮問題域的話,只看類圖,都是通過繼承來實現子類的擴張,都能解決動態變化的功能。因此都有一些共性:

​優點:

​1、 簡化了單元測試,因為每個演算法都有自己的類,可以通過自己的介面單獨測試。

2、 避免程式中使用多重條件轉移語句,使系統更靈活,並易於擴充套件。

缺點:

1、 因為每個具體策略類都會產生乙個新類,所以會增加系統需要維護的類的數量。

總結:其實23個設計模式,非要交合在一塊說,那麼我想說:都是相近的,因為他們統一的宗旨是:抽象,繼承,多型,封裝​,所以,設計模式每個和每個都有想象的地方,或許正因為是這樣,才有的設模式的三大類:建立型,結構性,行為型之分,然後,每個小的區域內,又有各個不同的側重點。

​​這是我學習設計模式的一點小感悟:

​學習設計模式:不謀全域性者,不足以某一域。

​​​使用設計模式:知其然,知其所以然。​

機房收費系統 再回首

機房收費系統陸陸續續都要結束了,回顧自己敲機房的經歷,一路上真的收穫了不少。技術篇 在實現功能的時候,有的東西以前接觸的不是很多,像資料匯出到excel,組合查詢,做報表等等,不過我們還是通過自己的思考和網路上的知識做到了。下面就具體分享一些具體的小細節 1.下手之前多乙份思考 if instr i...

linux 再回首 關於程序

1 全格式顯示系統中所有的程序資訊 ps ef 全格式顯示系統中所有的程序資訊 uid pid ppid c stime tty time cmd root 1 0 0 aug14 00 17 46 usr lib systemd systemd system deserialize 22 root...

再回首 回文字串

最長回文串 include include include define maxn 500 char buf maxn s maxn buffer 緩衝區 int p maxn int main 上述toupper函式如果c為小寫英文本母,則返回對應的大寫字母 否則返回原來的值 也就是在這個轉換的過...