第六章第二節 可維護的設計模式
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)】html
- 定義:工廠方法模式也被稱爲虛擬構造器。當client不知道要建立哪一個具體類的實例,或者不想在client代碼中指明要具體建立的實例時,用工廠方法。
- 意圖:定義一個用於建立對象的接口,讓其子類來決定實例化哪個類,從而使一個類的實例化延遲到其子類。
- 主要解決:主要解決接口選擇的問題。
- 應用實例: 您須要一輛汽車,能夠直接從工廠裏面提貨,而不用去管這輛汽車是怎麼作出來的,以及這個汽車裏面的具體實現。
- 優勢:
- 一個調用者想建立一個對象,只要知道其名稱就能夠了。
- 擴展性高,若是想增長一個產品,只要擴展一個工廠類就能夠。
- 屏蔽產品的具體實現,調用者只關心產品的接口。
- 缺點:每次增長一個產品時,都須要增長一個具體類和對象實現工廠,使得系統中類的個數成倍增長,在必定程度上增長了系統的複雜度,同時也增長了系統具體類的依賴。這並非什麼好事。
- 知足OCP(Open-Closed Principle):—對擴展的開放,對修改已有代碼的封閉
- 模式:
非靜態方法:算法
靜態方法:設計模式
【抽象工廠模式(Abstract Factory)】ide
- 定義:抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其餘工廠。該超級工廠又稱爲其餘工廠的工廠。
- 在抽象工廠模式中,接口是負責建立一個相關對象的工廠,不須要顯式指定它們的類。每一個生成的工廠都能按照工廠模式提供對象。
- 方法:提供接口以建立一組相關/相互依賴的對象,但不須要指明其具體類。
- 用途:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品時使用。例:①當一個UI,包含多個窗口控件,這些控件在不一樣的OS中實現不一樣。②當一個倉庫類,要控制多個設備,這些設備的製造商各有不一樣,控制接口有差別
- 優勢:當一個產品族中的多個對象被設計成一塊兒工做時,它能保證客戶端始終只使用同一個產品族中的對象。
- 缺點:產品族擴展很是困難,要增長一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的裏面加代碼。
- 使用場景: 一、QQ 換皮膚,一整套一塊兒換。 二、生成不一樣操做系統的程序。
- 如下面窗口滾動條爲例:
客戶端想要一個產品,由窗口和滾動條組成。因而能夠交給一個抽象工廠來作,這個工廠負責將產品的組件組裝起來成一個完整的產品。不一樣的產品繼承這個抽象工廠接口,實現本身的工廠方法。ui
下面是具體的實現spa
抽象工廠類型建立的不是一個完整產品,而是「產品族」(遵循 固定搭配規則的多類產品的實例),獲得的結果是:多個不一樣產品的 object,各產品建立過程對client可見,但「搭配」不能改變。操作系統
本質上,Abstract Factory是把多類產品的factory method組合在一塊兒。設計
【建造者模式(Builder Pattern)】代理
- 定義:建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個複雜的對象。該 Builder 類是獨立於其餘對象的。
- 方法:建立複雜對象,包含多個組成部分
- 意圖:將一個複雜的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示。
- 關鍵代碼:建造者:建立和提供實例,導演:管理建造出來的實例的依賴關係。
- 應用實例: 一、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是常常變化的,生成出所謂的"套餐"。 二、JAVA 中的 StringBuilder。
- 優勢: 一、建造者獨立,易擴展。 二、便於控制細節風險。
- 缺點: 一、產品必須有共同點,範圍有限制。 二、如內部變化複雜,會有不少的建造類。
- 模式圖:
- 例子: 咱們須要一個Pizza的產品,該Pizza產品的part是以三個屬性的形式體現,其builder就至關於給三個屬性賦值(也可更復雜)。
比較:工廠抽象模式(Factory method)和構造器模式(Builder method)
Abstract Factory建立的不是一個完整產品,而是「產品族」(遵循固定搭配規則的多類產品實例),獲得的結果是:多個不一樣產品的實例object,各產品建立過程對client可見,但「搭配」不能改變。server
Builder Factory建立的是一個完整的產品,有多個部分組成,client不需瞭解每一個部分是怎麼建立、各個部分怎麼組合,最終獲得一個產品的完整 object 。
比較:模板方法模式(Template method)和構造器模式(Builder method)
- Template Method:a behavioral pattern 目標是爲了複用算法的公共結構(次序)。
- 定義了一個操做中算法的骨架(steps),而將具體步驟的實現延遲到子類中, 從而複用算法的結構並可從新定義算法某些特定步驟的實現邏輯。
- 複用算法骨架,強調步驟的次序
- 子類override算法步驟
- Builder Factory:a creationalpattern 目標是「建立複雜對象」,靈活擴展
- 將一個複雜對象的構造方法與對象內部的具體表示分離出來,一樣的構造方法能夠創建不一樣的表現。
- 不強調複雜對象內部各部分的「次序」
- 子類override複雜對象內部各部分的「建立」
- 適應變化:經過派生新的builder來構造新的對象(即新的內部表示),OCP
## 結構化模式:Structual patterns
【橋接模式(Bridge Pattern)】
【代理模式(Proxy Pattern)】
【組合模式(Composite Pattern)】
## 行爲化模式:Behavioral patterns
【中介者模式(Mediator Pattern)】
【觀察者模式(Observer Pattern)】
【訪問者模式(Visitor Pattern)】
【責任鏈模式(Chain of Responsibility Pattern)】
【命令模式(Command Pattern)】