【設計模式】工廠方法模式

  0 簡單工廠模式數組

  0.0 簡單工廠模式動機函數

  考慮一個簡單的軟件應用場景,一個軟件系統可提供多個外觀不一樣按鈕(如圓形、矩形按、菱形按鈕等), 這些按鈕都源自同一個父類,不過在繼承父類後不一樣的子類修改了部分屬性從而使得它們可呈現不一樣外觀,若是但願在使用這些按鈕時,不須要知道這些具體按鈕類的名字,只須要知道表示該按鈕類的一個參數,並提供一個調用方便的方法,把該參數傳入方法便可返回一個相應的按鈕對象,此時,就可使用簡單工廠模式。spa

  0.1 模式定義設計

  簡單工廠模式(Simple Factory Pattern):又稱靜態工廠方法(Static Factory Method)    模式,它屬於類建立型模式。在簡單工廠模式中,能夠根據參數的不一樣返回不一樣類的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。對象

  0.2 模式結構blog

  簡單工廠模式包含以下角色:繼承

  • Factory:工廠角色
    工廠角色負責實現建立全部實例的內部邏輯
  • Product:抽象產品角色
    抽象產品角色是所建立的全部對象的父類,負責描述全部實例所共有的公共接口
  • ConcreteProduct:具體產品角色
  具體產品角色是建立目標,全部建立的對象都充當這個角色的某個具體類的實例。

 

0.3 簡單工廠模式的缺點接口

  • 因爲工廠類集中了全部產品建立邏輯,一旦不能正常工做,整個系統都要受到影響。
  • 使用簡單工廠模式將會增長系統中類的個數,在必定程序上增長了系統的複雜度和理解難度。
  • 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時,有可能形成工廠邏輯過於複雜,不利於系統的擴展和維護。
  • 簡單工廠模式因爲使用了靜態工廠方法,形成工廠角色沒法造成基於繼承的等級結構

1.工廠方法模式(Factory Method Pattern)資源

1.1 模式動機產品

在簡單工廠模式的例子中,設計一個按鈕工廠類(父類)統一負責全部產品建立。

在工廠方法模式中,將具體按鈕的建立過程,交給專門的工廠子類作。

先定義一個抽象的按鈕工廠類,在定義具體的工廠類生成(圓形,矩形,菱形按鈕),它們實如今抽象按鈕工廠類中定義方法。

若是出現新的按鈕類型,只需爲此建立一個新的具體工廠類得到實例。

1.2 模式定義

工廠方法模式也叫虛擬構造器,也叫多態工廠模式。

在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,

工廠子類負責生成具體的產品對象,這樣作的好處:將產品類的實例化操做延遲到工廠子類中完成,即:經過工廠子類肯定實例化罵一個具體產品。

1.3.模式結構

工廠方法模式包含以下角色:

  • Product:抽象產品
  • ConcreteProduct:具體產品
  • Factory:抽象工廠
  • ConcreteFactory:具體工廠

 

1.4.模式分析

工廠模式的主要功能:核心的工廠類再也不負責全部產品的建立,將具體的建立交給子類作,核心的工廠類只負責給出具體工廠必須實現的接口,不負責哪個產品類被實例化的細節,便可達到不修改工廠角色的狀況下引入新產品。

工廠父類:定義建立產品對象的公共接口;

工廠子類:負責生成具體的產品對象;子類決定具體實例化哪個具體產品類;

1.5 適用環境

  • 一個類不知道它所須要的對象的類
  • 一個類經過其子類來指定建立哪一個對象
  • 將建立對象額任務交給多個工廠子類的某一個

1.6 模式擴展

  • 適用多個工廠方法:在抽象工廠角色中定義多個工廠方法,實現不一樣的業務邏輯
  • 產品對象的重複使用:工廠對象將一個已經建立過的產品保存在一個集合(數組、List),根據用戶請求對集合進行查詢。若是沒有想要的對象,就建立一個而且加入到集合中在返回給用戶。

2.單例模式(singleton Pattern)

2.1 模式定義

單例模式確保某一個;類只有一個實例,並自行實例化向整個系統提供該實例,該類成爲單例類,它提供全局訪問方法。

單例模式的三個要點:

  • 某一個類只能有一實例
  • 它必須能自行建立這個實例
  • 它必須自行向整個系統提供這個實例

2.2 模式結構

  • SIngleton: 單例

 

 2.3 模式分析

單例模式保證一個類只有一個實例,單例類擁有一個私有構造器,肯定用戶沒法經過new關鍵字直接實例化它,該模式中包含一個靜態私有成員變量與一個靜態公有的工廠方法,該方法負責檢查實例的存在性和實例化本身,而後存儲在靜態成員變量中,以確保只有一個實例被建立。

單例模式實現的過程須要注意:

  • 單例類的構造函數爲私有;
  • 提供一個自身的靜態私有成員變量;
  • 提供一個公有的靜態工廠方法。

2.4 實例

在OS中,打印池是一個用於管理打印任務的應用程序,經過打印池用戶可刪除,停止,或者改變打印任務的優先級,在一個OS中只容許運行一個打印池對象,若是重複建立打印池會拋出異常。

2.5 適用環境

  • 系統只須要一個實例對象,如系統要求提供一個惟一的序列號生成器,或者須要考慮資源消耗太大而只容許建立一個對象。
  • 客戶調用類的單個實例只容許使用一個公共訪問點,除了該公共訪問點,不能經過其餘途徑訪問該實例。
  • 在一個系統中要求一個類只有一個實例時才應當使用單例模式。反過來,若是一個類能夠有幾個實例共存,就須要對單例模式進行改進,使之成爲多例模式
相關文章
相關標籤/搜索