1. 程式人生 > 其它 >設計模式綜述 設計模式綜述

設計模式綜述 設計模式綜述

設計模式綜述

        </h1>
        <div class="clear"></div>
        <div class="postBody">
            <div id="cnblogs_post_body" class="blogpost-body blogpost-body-html">

簡單概述一下23種設計模式

對於設計模式,在程式碼量多了之後,自然而然就會體會到設計模式的好處。

單例模式

確保某一個類只有一個例項,並且自行例項化並向整個系統提供這個例項。
優點:減少系統開銷,避免對資源多重利用。
缺點:沒有介面,不利於擴充套件。

工廠方法模式

定義一個用於建立物件的介面,讓子類決定例項化哪一個類。
工廠方法使一個類的例項化延遲到其子類。
優點:良好的封裝性,程式碼結構清晰,利於擴充套件,解耦。

抽象工廠模式

為建立一組相關或相互依賴的物件提供一個介面,並且無需指定他們的具體類,
優點:封裝性。
缺點:產品族擴充套件困難。
與工廠方法模式的區別是抽象工廠模式沒有指定具體類。

模板方法模式

定義一個操作中的演算法框架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構就可重定義該演算法的某些特定步驟。
也就是由子類實現對方法的排程。

建造者模式

將一個複雜物件的構建與它的表示分開,使得同樣的構建過程可以建立不同的表示。
優點:封裝性,建造者獨立,容易擴充套件,便於控制細節的風險。

代理模式

為其他物件提供一種代理以控制這個物件的訪問。

原型模式

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
在java中,也就是clone()方法。clone方法可以被重寫。
效能比較好,直接對二進位制流進行拷貝,避免了建構函式的約束。

中介者模式

用一箇中介物件封裝一系列物件的互動,中介者使各物件不需要顯示地相互作用,從而使其耦合鬆散,可以獨立改變他們之間的互動。
減少了類間依賴,但中介者邏輯複雜,類越多,邏輯越複雜。

命令模式

將一個請求封裝成一個物件,從而讓你使用不同的請求把客戶端引數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能。

責任鏈模式

使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係,將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為址。
缺點:效能和責任鏈有關,責任鏈太長,效能不好。

裝飾模式

動態地給一個物件新增額外的職責。

策略模式

定義一組演算法,每個演算法都封裝起來,並且使它們之間可以互換。
演算法可以自由切換,避免使用多重條件判斷,擴充套件性不好。

介面卡模式

將一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。
可以讓任意兩個沒有關係的類在一起執行。

迭代器模式

提供一種方法訪問一個容器物件中的各個元素,而又不需要暴露該物件的內部細節。
也就是是java中的Iterator迭代器。

組合模式

將物件組合成樹形結構以表示“部分-整體”的層次結構,使得使用者對單個物件和組合物件的使用具有一致性。

觀察者模式

物件間一種一對多的依賴關係,使得每當一個物件改變現狀,則所有依賴於它的物件都會得到通知並自動更新。

門面模式

一個子系統的外部和內部的通訊必須通過統一的物件進行。
提高安全性,減少相互依賴,提高靈活性。不符合開閉原則,對修改關閉,對擴充套件開放。

備忘錄模式

在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,這樣以後就可將該物件恢復到原先儲存的狀態。


這些是簡書上面的一些摘錄,隨著自己對設計模式的理解,會逐步完善這篇文章。

參考連結:http://www.jianshu.com/p/621f9f235a51

分類: 設計模式
<div id="blog_post_info">
好文要頂 關注我 收藏該文 wall-ee
關注 - 13
粉絲 - 33 +加關注 0 0
<div class="clear"></div>
<div id="post_next_prev">

<a href="https://www.cnblogs.com/pangjianxin/p/7911557.html" class="p_n_p_prefix">« </a> 上一篇:    <a href="https://www.cnblogs.com/pangjianxin/p/7911557.html" title="釋出於 2017-11-28 18:55">面象物件設計原則之六:迪米特原則(LeastKnowledge Principle, LKP)</a>
<br>
<a href="https://www.cnblogs.com/pangjianxin/p/7928083.html" class="p_n_p_prefix">» </a> 下一篇:    <a href="https://www.cnblogs.com/pangjianxin/p/7928083.html" title="釋出於 2017-11-30 11:21">GRASP軟體設計的模式和原則</a>