這篇博客是好久之前就打好的草稿,可是一直就拖到了現在,剛好在保定上課,筆記本也排不上大用場,翻看手機,終于撿起了這些草稿,決定寫完。
再說設計模式之前,我們先說說開閉原則。
## 一、開閉原則(ocp)
以前讀這些官方解釋,總是覺得很官方,現在在讀,覺得句句經典。和大家共享
遵循開閉原則設計出的模塊具有兩個主要特點:
(1)對于擴展是開放的(Open for extension)。這意味著模塊的行為是可以擴展的。當應用的需求改變時,我們可以對模塊進行擴展,使其具有滿足那些改變的新行為。也就是說,我們可以增加模塊的功能。
(2)對于修改是關閉的(Closed for modification)。對模塊行為進行擴展時,不必改動模塊的源代碼或者二進制代碼。模塊的二進制可執行版本,無論是可鏈接的庫、DLL或者.EXE文件,都無需改動。
**?注意**:開閉原則是針對一個模塊來說的,不然,開閉毫無意義。
這兩個模式是我們容易混淆的,因為從類圖是看,基本是一樣的。以前博客中都已經介紹過這幾個設計模式,這里不做詳細介紹,這篇博客是最近翻看筆記時的一點感觸,來說說這兩個設計模式的不同。
## 二、你還是你,我還是我——策略VS簡單工廠
1、問題域不同
首先看一下兩個模式的定義:
**策略模式**
策略模式(Strategy):它定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法的變化不會影響到使用算法的客戶。

**簡單工廠**
簡單工廠模式(Simple Factory Pattern)屬于類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。

最主要區別是就是:策略模式為行為型設計模式,而簡單工廠為創建型模式。兩個設計模式解決的問題域本就不同,側重點不一樣,放開眼界,學習這兩個模式,不可一起咬住不放。
2、開閉原則
策略模式的?**特點:**創建,選擇不同策略的責任在客戶端。
如果有擴展著怎么辦呢?需要如下變動:
1:策略端增加新的策略類,無需改動已有的策略端代碼————開閉原則
2:界面增加新策略字符串,**客戶端進行調用修改**————客戶端是無論如何都是要進行修改的。
那么我看簡單工廠的**特點:**選擇,創建的責任在算法端
所以如有擴展,需要如下變動:
1:算法端增加新的算法類,**調用算法的修改 還在 算法端**,需要改動兩處————違反開閉原則
2:客戶界面增加選擇新的算法的字符串————客戶端是必定要修改的
這就是區別二,一個遵循了開閉原則,一個沒有。還有一點就是,并不是不遵循開閉原則就一定不好,具體還是要看需求,具體對待。
宏觀上問題域不同,細節上,是否需要遵循開閉原則,?這兩點足以讓我們可以適時的選擇清楚簡單工廠和策略模式了。?
**三、策略 同 簡單工廠**
兩個模式不考慮問題域的話,只看類圖,都是通過繼承來實現子類的擴張,都能解決動態變化的功能。因此都有一些共性:
**優點:**
1、 簡化了單元測試,因為每個算法都有自己的類,可以通過自己的接口單獨測試。
2、 避免程序中使用多重條件轉移語句,使系統更靈活,并易于擴展。
**缺點:**
1、 因為每個具體策略類都會產生一個新類,所以會增加系統需要維護的類的數量。
**總結:**其實23個設計模式,非要交合在一塊說,那么我想說:都是相近的,因為他們統一的宗旨是:抽象,繼承,多態,封裝?,所以,設計模式每個和每個都有想象的地方,或許正因為是這樣,才有的設模式的三大類:創建型,結構性,行為型之分,然后,每個小的區域內,又有各個不同的側重點。
這是我學習設計模式的一點小感悟:
學習設計模式:不謀全局者,不足以某一域。
使用設計模式:知其然,知其所以然。?
- 前言
- 抽象工廠——創建型設計模式一
- 工廠三姐妹——創建型設計模式之二
- 初識面向對象設計模式
- 建造者模式——創建型模式之三
- 原型模式——創建型設計模式四
- 適配器 and 組合模式——結構性模式之一
- 橋接模式——結構性設計模式之二
- 組合模式——結構型設計模式之三
- 裝飾模式——結構型設計模式之四
- 外觀模式——結構型設計模式之五
- 代理模式——結構型設計模式之六
- 觀察者模式——行為型設計模式之五
- 模板設計——行為設計模式之一
- 命令模式——行為設計模式之二
- 狀態模式——行為型設計模式之三
- 職責模式——行為設計模式之四
- 中介模式——行為模式之六
- 策略+簡單工廠 實戰篇
- 看觀察者怎么全方位觀察機房收費系統
- 登陸也需要裝飾——機房收費系統裝飾模式實戰
- 何為抽象?你有本末倒置嗎?
- 再回首,策略、簡單工廠是否依然?
- 再回首——行為型設計模式