1. 程式人生 > >【軟件構造】第六章第二節 可維護的設計模式

【軟件構造】第六章第二節 可維護的設計模式

派生 ural bridge lose 復用 部分 sed spa line

第六章第二節 可維護的設計模式

Outline

  • 創造性模式:Creational patterns
    • 工廠模式(Factory Pattern)
    • 抽象工廠模式(Abstract Factory Pattern)
    • 建造者模式(Builder Pattern)
  • 結構化模式:Structural patterns
    • 橋接模式(Bridge Pattern)
    • 代理模式(Proxy Pattern)
    • 組合模式(Composite Pattern)
  • 行為化模式:Behavioral patterns
    • 中介者模式(Mediator Pattern)
    • 觀察者模式(Observer Pattern)
    • 訪問者模式(Visitor Pattern)
    • 責任鏈模式(Chain of Responsibility Pattern)
    • 命令模式(Command Pattern)

Notes:

## 創造性模式:Creational patterns

【工廠模式(Factory Pattern)】

  • 定義:工廠方法模式也被稱為虛擬構造器。當client不知道要創建哪個具體類的實例,或者不想在client代碼中指明要具體創建的實例時,用工廠方法。
  • 意圖:定義一個用於創建對象的接口,讓其子類來決定實例化哪一個類,從而使一個類的實例化延遲到其子類。
  • 主要解決:主要解決接口選擇的問題。
  • 應用實例: 您需要一輛汽車,可以直接從工廠裏面提貨,而不用去管這輛汽車是怎麽做出來的,以及這個汽車裏面的具體實現。
  • 優點:
    • 一個調用者想創建一個對象,只要知道其名稱就可以了。
    • 擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以。
    • 屏蔽產品的具體實現,調用者只關心產品的接口。
  • 缺點:每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴。這並不是什麽好事。
  • 滿足OCP(Open-Closed Principle):—對擴展的開放,對修改已有代碼的封閉
  • 模式:

技術分享圖片

  • 例子:

非靜態方法:

技術分享圖片

靜態方法:

技術分享圖片

【抽象工廠模式(Abstract Factory)】

  • 定義:抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。
  • 在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
  • 方法:提供接口以創建一組相關/相互依賴的對象,但不需要指明其具體類。
  • 用途:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品時使用。例:①當一個UI,包含多個窗口控件,這些控件在不同的OS中實現不同。②當一個倉庫類,要控制多個設備,這些設備的制造商各有不同,控制接口有差異
  • 優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
  • 缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 裏加代碼,又要在具體的裏面加代碼。
  • 使用場景: 1、QQ 換皮膚,一整套一起換。 2、生成不同操作系統的程序。
  • 以下面窗口滾動條為例:

  客戶端想要一個產品,由窗口和滾動條組成。於是可以交給一個抽象工廠來做,這個工廠負責將產品的組件組裝起來成一個完整的產品。不同的產品繼承這個抽象工廠接口,實現自己的工廠方法。

技術分享圖片

  下面是具體的實現

技術分享圖片

技術分享圖片

  抽象工廠類型創建的不是一個完整產品,而是“產品族”(遵循 固定搭配規則的多類產品的實例),得到的結果是:多個不同產品的 object,各產品創建過程對client可見,但“搭配”不能改變。

  本質上,Abstract Factory是把多類產品的factory method組合在一起。

【建造者模式(Builder Pattern)】

  • 定義:建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個復雜的對象。該 Builder 類是獨立於其他對象的。
  • 方法:創建復雜對象,包含多個組成部分
  • 意圖:將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
  • 關鍵代碼:建造者:創建和提供實例,導演:管理建造出來的實例的依賴關系。
  • 應用實例: 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder。
  • 優點: 1、建造者獨立,易擴展。 2、便於控制細節風險。
  • 缺點: 1、產品必須有共同點,範圍有限制。 2、如內部變化復雜,會有很多的建造類。
  • 模式圖:

技術分享圖片

  • 例子: 我們需要一個Pizza的產品,該Pizza產品的part是以三個屬性的形式體現,其builder就相當於給三個屬性賦值(也可更復雜)。

技術分享圖片

技術分享圖片

技術分享圖片

比較:工廠抽象模式(Factory method)和構造器模式(Builder method)

  Abstract Factory創建的不是一個完整產品,而是“產品族”(遵循固定搭配規則的多類產品實例),得到的結果是:多個不同產品的實例object,各產品創建過程對client可見,但“搭配”不能改變。

  Builder Factory創建的是一個完整的產品,有多個部分組成,client不需了解每個部分是怎麽創建、各個部分怎麽組合,最終得到一個產品的完整 object 。

比較:模板方法模式(Template method)和構造器模式(Builder method)

  • Template Method:a behavioral pattern 目標是為了復用算法的公共結構(次序)。
    • 定義了一個操作中算法的骨架(steps),而將具體步驟的實現延遲到子類中, 從而復用算法的結構並可重新定義算法某些特定步驟的實現邏輯。
    • 復用算法骨架,強調步驟的次序
    • 子類override算法步驟
  • Builder Factory:a creationalpattern 目標是“創建復雜對象”,靈活擴展
    • 將一個復雜對象的構造方法與對象內部的具體表示分離出來,同樣的構造方法可以建立不同的表現。
    • 不強調復雜對象內部各部分的“次序”
    • 子類override復雜對象內部各部分的“創建”
    • 適應變化:通過派生新的builder來構造新的對象(即新的內部表示),OCP

【軟件構造】第六章第二節 可維護的設計模式