在某些情況下,對象的創建很復雜,可能需要某種程度的抽象,以便客戶端代碼無法意識到這些復雜性和內部實現細節。 在某些情況下,對象的創建在代碼的各個部分中是分散的和重復的。Factory模式通過定義一個接口專門解決了該問題,這些接口專門創建對象,但為實現類提供了靈活性,可以決定實例化哪個類。
定義: |
Factory方法模式是定義用于創建對象的接口,但將對象創建委托給子類。 |
目的:
查看問題陳述,目標應該是:
- 客戶端應該不知道對象實例化
- 客戶端應通過公共接口訪問對象。
你知道嗎? |
工廠方法設計模式通常與裝飾器設計模式一起用于各種框架(例如Struts,Spring,Apache)中。 有許多基于此Factory模式的J2EE模式,例如DAO模式。 |
工廠模式使用哪種面向對象設計原理?
封裝:因為它封裝了來自客戶端的創建代碼。 顯然,您可以認為封裝的好處也適用于這種模式,例如松耦合和內聚。
實際示例:
考慮一個服裝工廠,該工廠生產各種類型的服裝,例如襯衫,褲子。 消費者可以通過工廠索要所需的服裝類型。 但是,從消費者的角度來看,他們完全不知道是誰在創建此對象。 他們只是知道工廠正在為他們提供所需的服裝。
問題陳述:
一種標準做法是通過調用“ new”關鍵字來創建對象。 設想一個場景,在客戶端類中有多種情況,我們調用了多個新關鍵字來創建新對象。
if (selection.equalsIgnoreCase("Trouser")) {return new Trouser();} else if (selection.equalsIgnoreCase("Shirt")) {return new Shirt();}
如果現在必須添加外套或毛衣,則必須繼續修改客戶端代碼,并進一步添加new關鍵字。 這將導致對客戶端代碼的依賴,從而使其難以維護。
另一個問題是客戶端應用程序必須知道有多少種具體的類可以使用。 以后,如果我們必須添加另一個具體類,例如毛衣或夾克,則必須更改并重新編譯客戶代碼。
解:
為了解決上述問題,可以顯式使用工廠模式。
- 使用Factory類可以解決訪問太多新關鍵字的第一個問題。
- 第二個問題可以通過使用具體類將實現的接口來解決,并且客戶端將始終指向該接口類而不是具體類。 因此,通過這種方式,客戶將完全不知道所需的各種類型的具體類。
什么是接口? |
Java中的接口是沒有實現的方法定義的集合。 實現接口的類必須提供實現,并且必須實現接口中描述的所有方法。 接口是一個契約,它告訴類要做什么,讓類決定如何實現它們。
|
下面的類圖將全面概述Factory Pattern的實現:
![]() |
工廠模式類圖 |
讓我們看一下實現工廠模式的示例代碼:
GarmentType.java |
|
Trouser.java |
|
Shirt.java |
|
GarmentFactory.java |
|
客戶端程序 |
|
工廠模式的優勢:
a)此客戶端不需要了解需要創建的對象的子類。 它需要引用接口和工廠對象。
b)對象創建過程從客戶端帶到工廠,從而使客戶端代碼與對象創建代碼脫鉤。 反過來,這將有助于重用,因為此代碼可被其他客戶端使用。 c)Factory模式還有助于提高應用程序的可伸縮性,因為客戶端代碼僅引用接口,我們可以添加更多實現該接口的產品而無需在客戶端代碼中進行很多更改。 d)如果應用程序使用Factory模式(因為對象創建是集中的),則代碼可維護性是有益的。
參考: 通過 Idiotechie博客上的JCG合作伙伴 Mainak Goswami 使用Factory Pattern解決設計問題 。
翻譯自: https://www.javacodegeeks.com/2012/07/solve-design-problems-using-factory.html