天天看點

工廠模式

工廠模式有 3 種不同的實作方式,分别是簡單工廠模式、工廠方法模式和抽象工廠模式

一、簡單工廠模式

簡單工廠模式每增加一個産品就要增加一個具體産品類和一個對應的具體工廠類,這增加了系統的複雜度,違背了“開閉原則”,如果要建立的産品不多,隻要一個簡單工廠類就可以完成。

1.優點和缺點

優點:

  1. 工廠類包含必要的邏輯判斷,可以決定在什麼時候建立哪一個産品的執行個體。用戶端可以免除直接建立産品對象的職責,很友善的建立出相應的産品。工廠和産品的職責區分明确。
  2. 用戶端無需知道所建立具體産品的類名,隻需知道參數即可。
  3. 也可以引入配置檔案,在不修改用戶端代碼的情況下更換和添加新的具體産品類。

缺點:

  1. 簡單工廠模式的工廠類單一,負責所有産品的建立,職責過重,一旦異常,整個系統将受影響。且工廠類代碼會非常臃腫,違背高聚合原則。
  2. 使用簡單工廠模式會增加系統中類的個數(引入新的工廠類),增加系統的複雜度和了解難度
  3. 系統擴充困難,一旦增加新産品不得不修改工廠邏輯,在産品類型較多時,可能造成邏輯過于複雜
  4. 簡單工廠模式使用了 static 工廠方法,造成工廠角色無法形成基于繼承的等級結構。

2.應用場景

對于産品種類相對較少的情況,考慮使用簡單工廠模式。使用簡單工廠模式的用戶端隻需要傳入工廠類的參數,不需要關心如何建立對象的邏輯,可以很友善地建立所需産品。

模式的結構與源碼展現

簡單工廠模式的主要角色如下:

  • 簡單工廠(SimpleFactory):是簡單工廠模式的核心,負責實作建立所有執行個體的内部邏輯。工廠類的建立産品類的方法可以被外界直接調用,建立所需的産品對象。
  • 抽象産品(Product):是簡單工廠建立的所有對象的父類,負責描述所有執行個體共有的公共接口。
  • 具體産品(ConcreteProduct):是簡單工廠模式的建立目标。

3.結構圖

工廠模式

4.源碼展現

java.util.Calendar的方法:Calendar createCalendar(TimeZone zone, Locale aLocale)

ch.qos.logback.classic的方法:Logger getLogger(final String name)

二、工廠方法模式

工廠方法模式”是對簡單工廠模式的進一步抽象化,其好處是可以使系統在不修改原來代碼的情況下引進新的産品,即滿足開閉原則。

  • 使用者隻需要知道具體工廠的名稱就可得到所要的産品,無須知道産品的具體建立過程。
  • 靈活性增強,對于新産品的建立,隻需多寫一個相應的工廠類。
  • 典型的解耦架構。高層子產品隻需要知道産品的抽象類,無須關心其他實作類,滿足迪米特法則、依賴倒置原則和裡氏替換原則。
  • 類的個數容易過多,增加複雜度
  • 增加了系統的抽象性和了解難度
  • 抽象産品隻能生産一種産品,此弊端可使用抽象工廠模式解決。

  • 客戶隻知道建立産品的工廠名,而不知道具體的産品名。如 TCL 電視工廠、海信電視工廠等。
  • 建立對象的任務由多個具體子工廠中的某一個完成,而抽象工廠隻提供建立産品的接口。
  • 客戶不關心建立産品的細節,隻關心産品的品牌

3.模式的結構

工廠方法模式由抽象工廠、具體工廠、抽象産品和具體産品等4個要素構成。

工廠方法模式的主要角色如下。

  1. 抽象工廠(Abstract Factory):提供了建立産品的接口,調用者通過它通路具體工廠的工廠方法 newProduct() 來建立産品。
  2. 具體工廠(ConcreteFactory):主要是實作抽象工廠中的抽象方法,完成具體産品的建立。
  3. 抽象産品(Product):定義了産品的規範,描述了産品的主要特性和功能。
  4. 具體産品(ConcreteProduct):實作了抽象産品角色所定義的接口,由具體工廠來建立,它同具體工廠之間一一對應。

結構圖:

工廠模式

org.slf4j.ILoggerFactory的Logger getLogger(String var1);

java.net.URLStreamHandlerFactory的URLStreamHandler createURLStreamHandler(String protocol);

三、抽象工廠模式

抽象工廠(AbstractFactory)模式的定義:是一種為通路類提供一個建立一組相關或互相依賴對象的接口,且通路類無須指定所要産品的具體類就能得到同族的不同等級的産品的模式結構。

抽象工廠模式是工廠方法模式的更新版本,工廠方法模式隻生産一個等級的産品,而抽象工廠模式可生産多個等級的産品。

使用抽象工廠模式一般要滿足以下條件。

  • 系統中有多個産品族,每個具體工廠建立同一族但屬于不同等級結構的産品。
  • 系統一次隻可能消費其中某一族産品,即同族的産品一起使用。

抽象工廠模式除了具有工廠方法模式的優點外,其他主要優點如下。

  • 可以在類的内部對産品族中相關聯的多等級産品共同管理,而不必專門引入多個新的類來進行管理。
  • 當需要産品族時,抽象工廠可以保證用戶端始終隻使用同一個産品的産品組。
  • 抽象工廠增強了程式的可擴充性,當增加一個新的産品族時,不需要修改原代碼,滿足開閉原則。

其缺點是:當産品族中需要增加一個新的産品時,所有的工廠類都需要進行修改。增加了系統的抽象性和了解難度。

工廠模式

抽象工廠模式最早的應用是用于建立屬于不同作業系統的視窗構件。如 Java 的 AWT 中的 Button 和 Text 等構件在 Windows 和 UNIX 中的本地實作是不同的。

抽象工廠模式通常适用于以下場景:

  1. 當需要建立的對象是一系列互相關聯或互相依賴的産品族時,如電器工廠中的電視機、洗衣機、空調等。
  2. 系統中有多個産品族,但每次隻使用其中的某一族産品。如有人隻喜歡穿某一個品牌的衣服和鞋。
  3. 系統中提供了産品的類庫,且所有産品的接口相同,用戶端不依賴産品執行個體的建立細節和内部結構。

抽象工廠模式同工廠方法模式一樣,也是由抽象工廠、具體工廠、抽象産品和具體産品等 4 個要素構成,但抽象工廠中方法個數不同,抽象産品的個數也不同。現在我們來分析其基本結構和實作方法。

1. 模式的結構

抽象工廠模式的主要角色如下。

  1. 抽象工廠(Abstract Factory):提供了建立産品的接口,它包含多個建立産品的方法 newProduct(),可以建立多個不同等級的産品。
  2. 具體工廠(Concrete Factory):主要是實作抽象工廠中的多個抽象方法,完成具體産品的建立。
  3. 抽象産品(Product):定義了産品的規範,描述了産品的主要特性和功能,抽象工廠模式有多個抽象産品。
  4. 具體産品(ConcreteProduct):實作了抽象産品角色所定義的接口,由具體工廠來建立,它同具體工廠之間是多對一的關系。

抽象工廠模式的結構圖

工廠模式

從圖可以看出抽象工廠模式的結構同工廠方法模式的結構相似,不同的是其産品的種類不止一個,是以建立産品的方法也不止一個。

抽象工廠:java.sql.Connection

産品族:Statement ,PreparedStatement ,DatabaseMetaData

具體工廠:

Statement createStatement()

PreparedStatement prepareStatement(String sql)

DatabaseMetaData getMetaData()

具體産品:實作類

抽象工廠:java.sql.Connection.SqlSessionFactory; 産品族:sqlSession、Configuration

SqlSession openSession();

Configuration getConfiguration();

具體産品:DefaultSqlSession,SqlSessionManager等實作類

5.模式的擴充

抽象工廠模式的擴充有一定的“開閉原則”傾斜性:

  1. 當增加一個新的産品族時隻需增加一個新的具體工廠,不需要修改原代碼,滿足開閉原則。
  2. 當産品族中需要增加一個新種類的産品時,則所有的工廠類都需要進行修改,不滿足開閉原則。

另一方面,當系統中隻存在一個等級結構的産品時,抽象工廠模式将退化到工廠方法模式。

參考:http://c.biancheng.net/view/1351.html

繼續閱讀