什麼是設計模式?為什麼要使用設計模式?有什麼好處?
設計模式(Design pattern
):是針對設計問題的通用解決方案。
使用設計模式:可以把它應用到特定的應用中,用於解決相似的問題。
使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。
真正理解什麼是設計模式,就是要透徹理解OO
的四大要素:封裝、繼承、多型和關聯。其中核心是封裝的概念。
常用設計模式的一些優缺點
1 簡單工廠模式(Static Factory Method
)
適用場景
工廠類負責建立的物件比較少。
客戶只知道傳入工廠類的引數,對於如何建立物件(邏輯)不關心。
由於簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。
優點
工廠類是整個模式的關鍵。包含了必要的邏輯判斷,根據外界給定的資訊,決定究竟應該建立哪個具體類的物件。
通過使用工廠類,外界可以從直接建立具體產品物件的尷尬局面擺脫出來,僅僅需要負責“消費”物件就可以了。而不必管這些物件究竟如何建立及如何組織的。明確了各自的職責和權利,有利於整個軟體體系結構的優化。
缺點
- 由於工廠類集中了所有例項的建立邏輯,違反了高內聚責任分配原則,將全部建立邏輯集中到了一個工廠類中,它所能建立的類只能是事先考慮到的,如果需要新增新的類,則就需要改變工廠類了。
- 當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件建立不同例項的需求。這種對條件的判斷和對具體產品型別的判斷交錯在一起,很難避免模組功能的蔓延,對系統的維護和擴充套件非常不利。
- 這些缺點在工廠方法模式中得到了一定的克服。
2 策略模式(Strategy
)
適用場景
- 多個類有不同的表現形式,每種表現形式可以獨立成單獨的演算法。
- 需要再不同情況下使用不同的演算法,以後演算法可能還會增加。
- 對使用者隱藏演算法邏輯。
優點
- 每個演算法單獨封裝,減少了演算法和演算法呼叫者的耦合。
- 合理使用繼承有助於提取出演算法中的公共部分。
- 簡化了單元測試。
缺點
- 策略模式只適用於客戶端知道所有的演算法或行為的情況。
- 策略模式造成很多的策略類,每個具體策略類都會產生一個新類。不過可以使用享元模式來減少物件的數量。
3 裝飾模式(Decorator
)
適用場景
- 需要擴充套件一個類的功能,或給一個類新增附加職責。
- 需要動態的給一個物件新增功能,這些功能可以再動態的撤銷。
- 需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關係變的不現實。
- 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴充套件,為支援每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於生成子類。
優點
Decorator
模式與繼承關係的目的都是要擴充套件物件的功能,但是Decorator
可以提供比繼承更多的靈活性。- 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。
缺點
- 這種比繼承更加靈活機動的特性,也同時意味著更加多的複雜性。
- 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程式變得很複雜。
- 裝飾模式是針對抽象元件(
Component
)型別程式設計。但是,如果你要針對具體元件程式設計時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component
介面,增加新的公開的行為,實現“半透明”的裝飾者模式。在實際專案中要做出最佳選擇。
4 代理模式(Proxy
)
適用場景
- 遠端代理,為一個物件在不同的地址空間提供區域性代表,這樣就可以隱藏一個物件存在於不同地址空間的事實。
- 虛擬代理,是根據需要建立開銷很大的物件。通過它來存放例項化需要很長時間的真是物件。
- 安全代理,用來控制真實物件訪問時的許可權。
- 智慧指引,是指當呼叫真是的物件時,代理處理另外的一些事情。
優點
- 職責清晰,真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務,附帶的結果就是程式設計簡潔清晰。
- 代理物件可以在客戶端和目標物件之間起到中介的作用,這樣起到了中介的作用和保護了目標物件的作用。
- 高擴充套件性
缺點
- 在客戶端和目標物件增加一個代理物件,會造成請求處理速度變慢。
- 增加了系統的複雜度。
5 工廠方法模式(Factory Method
)
適用場景
- 工廠方法模式是
new
一個物件的替代品,所以在所有需要生成物件的地方都可以使用,但是需要慎重地考慮是否要增加一個工廠類進行管理,增加程式碼的複雜度。 - 需要靈活的、可擴充套件的框架時,可以考慮採用工廠方法模式。
- 工廠方法模式可以用在異構專案中,例如通過
WebService
與一個非Java
的專案互動,雖然WebService
號稱是可以做到異構系統的同構化,但是在實際的開發中,還是會碰到很多問題,如型別問題、WSDL檔案的支援問題,等等,從WSDL中產生的物件都認為是一個產品,然後由一個具體的工廠類進行管理,減少與外圍系統的耦合。 - 可以使用在測試驅動開發的框架下,例如,測試一個類A,就需要把與類A有關聯關係的類
B
也同時產生出來,我們可以使用工廠方法模式把類B虛擬出來,避免類A與類B的耦合。目前由於JMock
和EasyMock
的誕生,該使用場景已經弱化了,讀者可以在遇到此種情況時直接考慮使用JMock或EasyMock。
優點
- 良好的封裝性,程式碼結構清晰,減少模組間的耦合。
- 工廠方法模式的擴充套件性非常優秀。
- 遮蔽產品類。
- 工廠方法模式是典型的解耦框架。
缺點
- 使用者必須知道相應工廠的存在。
- 每次增加一個產品時,都需要增加一個具體類和物件實現工廠,是的系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。
6 原型模式(Prototype
)
適用場景
- 某些結構複雜的物件的建立工作;由於需求的變化,這些物件經常面臨著劇烈的變化,但是他們卻擁有比較穩定一致的介面。
- 一般在初始化的資訊不發生變化的情況下,克隆是最好的方法。
優點
- 隱藏了物件建立的細節。
- 提高了效能。
- 不用重新初始化,動態獲得物件執行時的狀態。
缺點
- 適用性不是很廣。
- 每一個類必須配備一個克隆方法。
- 配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支援序列化的間接物件,或者引用含有迴圈結構的時候。
7 模板方法模式(Template Method
)
適用場景
- 適用於子類中有重複的程式碼,可以把重複程式碼提取出來,放到父類中。
優點
- 提高程式碼複用性。
- 幫助子類擺脫重複的不變行為。
缺點
- 考慮不全面統一出現問題。
好處
重用性
擴充套件性
靈活性
結構型設計模式:鬆耦合
避免了客戶端環境與產品物件複雜的構造邏輯耦合
相關文章
- 什麼是設計模式設計模式
- 為什麼 JavaScript 要設計原型模式JavaScript原型模式
- 設計+雲桌面是一種什麼模式模式
- 什麼是lambda?有什麼好處
- 什麼是程式碼審計?程式碼審計有什麼好處?
- UI設計是什麼_UI設計學什麼?UI
- 使用雲端計算有什麼好處?有什麼幫助
- 設計模式的數學定義是什麼?設計模式
- 為什麼一定要學習設計模式設計模式
- 為什麼要學習Linux?學習Linux有什麼好處?Linux
- Go 為什麼要設計 iota 常量?Go
- 為什麼有的人仇恨設計模式? - Allen Holub設計模式
- 為什麼要開展等級保護工作?有什麼好處?
- 設計模式:代理模式是什麼,Spring AOP還和它有關係?設計模式Spring
- 什麼是勞動力管理?有什麼好處?
- DevOps的目標是什麼?有什麼好處?dev
- 好程式設計師:web前端解答為什麼要學JavaScript程式設計師Web前端JavaScript
- 運維審計是什麼意思?有什麼作用?用什麼軟體好?運維
- UI設計要學些什麼?UI
- 什麼是WHQL?WHQL對驅動有什麼好處?
- 什麼是AOP程式設計?程式設計
- 中國程式設計師為什麼要跳槽?程式設計師
- 為什麼要成為「無敵」程式設計師?程式設計師
- 好程式設計師Java分享為什麼要使用Docker程式設計師JavaDocker
- Python 為什麼如此設計?Python
- 1024為什麼是程式設計師日程式設計師
- 好程式設計師Java培訓分享Java有什麼優勢 為什麼學的人多程式設計師Java
- Python是什麼?為什麼要掌握python?Python
- 什麼是程式設計?大道之行也,“程式設計”為公程式設計
- 刨根問底 : 為什麼, unity 的 Y軸 使用 慣性座標系 旋轉, 原因是什麼,為什麼要這樣設計,理由Unity
- 什麼是網頁設計的"原子設計”?網頁
- Python為什麼這麼熱門?學習Python有什麼好處?Python
- Docker是什麼?使用Docker的好處有哪些?Docker
- 不容錯過!什麼是領域驅動設計?為什麼落地這麼難?
- 什麼是前奏設計 1/2
- 什麼是前奏設計 2/2
- 電腦程式設計是什麼?程式設計
- Python tkinter是什麼?GUI程式設計有哪些?PythonGUI程式設計