- 將不變性抽象化。 - 不同模式可以互相組合搭配。 * [[wp>Software design pattern]] * [[http://www.yinwang.org/blog-cn/2013/03/07/design-patterns/|解密“设计模式”]] ====== 創建型模式 ====== *[[wp>Creational pattern|Creational pattern (創建型模式)]] * 著重於物件的創建。 * [[wp>Abstract factory pattern|Abstract factory pattern (抽象工廠模式)]] * 產品可以由不同工廠所生產,將工廠抽象化。 * [[wp>Builder pattern|Builder pattern (創造者模式)]] * 將創造一複雜物件的流程抽象化,並確保流程上每一步驟均被執行。客戶端透過 director,director 再透過 builder 創建物件。 * [[wp>Factory method pattern|Factory method pattern (工廠方法模式)]] * 構建並傳回物件的函式。 * [[wp>Prototype pattern|Prototype pattern (原型模式)]] * 具有 clone 函式的物件,可用來複製出多個相同物件。 * [[wp>Singleton pattern|Singleton pattern (獨體模式)]] * 私有化建構子。提供一個取得實體的接口,並由該接口判斷是否需要產生新的實體。 ====== 結構型模式 ====== * [[wp>Structural pattern|Structural pattern (結構型模式)]] * 著重於類別間的關係。 * [[wp>Adapter|Adapter (轉接器模式)]] * 轉接器負責匹配兩者之間的介面。 * [[wp>Bridge pattern|Bridge pattern (橋接模式)]] * 利用 CARP (合成/聚合複用原則) 解耦類別之間的關係。 * [[wp>Composite pattern|Composite pattern (組合模式)]] * 整體與部分可以被一致對待。 * [[wp>Decorator pattern|Decorator pattern (裝飾模式)]] * 動態為物件加上屬性,而非直接修改物件加上屬性。 * [[wp>Facade pattern|Facade pattern (外觀模式)]] * 由單一類別負責操作多個類別的組合調用,類似於基金操作。 * [[wp>Flyweight pattern|Flyweight pattern (享元模式)]] * 共用物件,並將變因抽出成外部變數。 * [[wp>Proxy pattern|Proxy pattern (代理模式)]] * 提供和被代理人相同的介面,並內含被代理人實體。客戶端只和代理接觸,代理再將需求轉發給被代理人執行。 ====== 行為型模式 ====== * [[wp>Behavioral pattern|Behavioral pattern (行為型模式)]] * 著重於類別之間的溝通。 * [[wp>Chain-of-responsibility pattern|Chain-of-responsibility pattern (職責鏈模式)]] * 串接回調函式,使其有機會處理同一事件。 * [[wp>Command pattern|Command pattern (命令模式)]] * 將類別方法抽象成命令類。 * [[wp>Interpreter pattern|Interpreter pattern (解釋器模式)]] * 設計小型程式語言。每一個表達式皆有一個 interpret 接口,用以解釋 (執行) 自身。 * [[wp>Iterator pattern|Iterator pattern (迭代器模式)]] * 類別提供迭代接口,以便在集合內被存取。 * [[wp>Mediator pattern|Mediator pattern (仲介者模式)]] * 仲介者類別知道系統中的所有類別,系統中的類別只知道仲介者類別。類別溝通時,均透過仲介者類別轉發訊息。 * [[wp>Memento pattern|Memento pattern (備忘錄模式)]] * 類別提供保存/回復其內部狀態的接口。 * [[wp>Observer pattern|Observer pattern (觀察者模式)]] * 當一類別狀態改變,如何通知所有相依類別的方式。 * [[wp>Delegation pattern|Delegation pattern (委託模式)]] * observer 註冊回調函式至 subject,當 subject 狀態更新,調用已註冊的回調函式。 * [[wp>State pattern|State pattern (狀態模式)]] * 當狀態轉換過多時,將狀態抽象成類別,並在類別之內負責狀態轉換。 * [[wp>Strategy pattern|Strategy pattern (策略模式)]] * 提煉不同演算法的相同介面。透過一個上下文類別 (context) 保存演算法實體。客戶端只和該上下文類別接觸,上下文類別再調用演算法實體運行演算法。 * [[wp>Template method pattern|Template method pattern (範本方法模式)]] * 將演算法共同部分抽象化,將其細節部分延遲至子類別實現。 * [[wp>Visitor pattern|Visitor pattern (訪問者模式)]] * 如果欲訪問的元素類別固定,可以將欲訪問的內容抽象化成訪問者類別。 ====== 物件導向設計原則 ====== * [[wp>Single responsibility principle|Single responsibility principle (單一職責原則)]] * 簡化類別的工作。 * [[wp>Open/closed principle|Open/closed principle (開放/封閉原則)]] * 多擴展,少修改。當遇到需求改動時,建立抽象以便隔離將來可能的改動,改以擴展應付需求。 * [[wp>Dependency inversion principle|Dependency inversion principle (依賴倒轉原則)]] * 針對接口 (interface) 而非底層實現 (implementation) 撰寫程式。 * [[wp>Liskov substitution principle|Liskov substitution principle (Liskov 替換原則)]] * 父類別必須可以用子類別加以抽換,而不影響程式運行。 * [[wp>Law of Demeter|Law of Demeter (迪米特法則)]] * 透過第三方負責兩個類別之間的溝通,盡可能對類別解耦。 * [[wp>Reflection (computer programming)|Reflection (反射)]] * 可以在運行時,根據字串選擇要實體化何種類別。 ====== 參考 ====== * [[http://coolshell.cn/articles/3320.html|JDK里的设计模式]] * [[http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns|Examples of GoF Design Patterns]] ====== 外部連結 ====== * [[http://openhome.cc/Gossip/DesignPattern/|非關語言: 設計模式]] * [[http://www.cnblogs.com/cj723/|伍迷家园]] * [[http://martinfowler.com/eaaCatalog/|Catalog of Patterns of Enterprise Application Architecture]] * [[http://www.dofactory.com/net/design-patterns|.NET Design Patterns]]