在前面的“設計模式”示例中,我們解釋了當今常用的“工廠”模式。 在本節中,我們將了解具有更多抽象的更高級的解決方案。 該模式稱為工廠方法設計模式。
定義: |
---|
Factory方法模式提供了一種用于創建對象的方法,但是將對象創建委托給了子類。 工廠方法設計模式以類似于工廠模式的方式解決了這些問題,并附加了抽象級別。 |
可以使用new關鍵字實例化該對象。 例如,對象A使用以下方法創建另一個對象B:
ClassB objB = new ClassB();
因此,對象A擁有對對象B的引用。
對象實例化對象實例化
由于如果后來修改了對象A,則對象A現在依賴于對象B,那么我們將不得不重新編譯對象A。 對象的創建可能會更加復雜,如果存在更多的耦合,那么維護將是軟件開發中一項痛苦而昂貴的工作。
為了避免這種最壞的情況,我們提供了新穎的設計模式來進行救援。 他們試圖在客戶端和對象創建者之間創建松散的耦合,并為開發人員提供其他一些設計優勢。 工廠方法模式就是解決設計問題的一種模式。
常用: |
---|
工廠方法設計模式通常與裝飾器設計模式一起用于各種框架(例如Struts,Spring,Apache)中。 有許多基于此Factory模式的J2EE模式,例如DAO模式。 |
讓我們以服裝工廠為例,我們正在創建各種類型的服裝,但是客戶完全不知道這些產品是如何創建的。 即使我們必須添加新的服裝類型(例如夾克),也無需更改客戶端代碼,從而增加了應用程序的靈活性。
工廠模式類圖
何時使用工廠方法模式?
- 對象的創建需要代碼的重用,而無需大量重復代碼。
- 一個類將不知道需要創建哪些子類。
- 子類可以指定應創建的對象。
- 父類會將對象的創建委托給其子類。
結構體
下圖突出顯示了工廠方法設計模式的典型結構。 與上述示例不同,已添加了一個附加的Factory Abstract(Factory)類。
工廠方法設計模式(UML)
在上圖中,以下是參與者:
- 產品:這為工廠方法創建的對象定義了一個接口。
- 具體產品:實現產品接口。
- 工廠(創建者):這是一個抽象類,定義了返回產品對象的工廠方法。
- 具體工廠:此類實現并覆蓋由父工廠類聲明的方法。
客戶(例如,對象類A)將要使用由ConcreteFactory類(對象類B)創建的產品。 但是,在這種情況下,客戶端僅持有對接口B的引用,而不是對象“類B”,因此它不需要了解有關類B的任何信息。 實際上,可以有多個類可以實現抽象類。
Factory Method模式允許子類決定實例化哪個類的含義是什么? |
從根本上講,這意味著對工廠抽象類進行編碼,而無需知道將實例化哪些實際的ConcreteProduct類,即它是Trouser還是Shirt。 這完全由ConcreteFactory類確定。 |
現在,將上述模式實現到我們的GarmentFactory示例中。
工廠方法示例
讓我們開始吧。 我們不會重復在Factory Pattern文章中找到的具體產品的代碼,例如Shirt.java和Trouser.java。
已創建一個面向客戶的新Factory抽象類。
public abstract class Factory {protected abstract GarmentType createGarments(String selection);}
需要修改GarmentFactory類以繼承抽象類Factory。
public class GarmentFactory extends Factory{public GarmentType createGarments(String selection) {if (selection.equalsIgnoreCase('Trouser')) {return new Trouser();} else if (selection.equalsIgnoreCase('Shirt')) {return new Shirt();}throw new IllegalArgumentException('Selection doesnot exist');}
}
客戶端類引用Factory類,并對Factory的createGarments(selection)方法進行分類以在運行時創建產品。
Factory factory = new GarmentFactory();
GarmentType objGarmentType = factory.createGarments(selection);
System.out.println(objGarmentType.print());
優點:
- 通過將對象創建從客戶端代碼移到Factory類及其子類,代碼可以靈活,松耦合和可重用。 由于異議創建是集中的,因此維護此類代碼更加容易。
- 客戶代碼僅處理產品接口,因此無需修改客戶代碼邏輯即可添加任何具體產品。
- Factory Method的優點是它可以多次返回相同的實例,或者可以返回子類而不是該確切類型的對象。
- 它通過在工廠中創建對象來鼓勵代碼的一致性,該工廠強制執行每個人都必須遵循的一組明確的規則。 這樣可以避免在不同的客戶端使用不同的構造函數。
例:
JDBC是這種模式的一個很好的例子。 應用程序代碼不需要知道將與哪個數據庫一起使用,因此不需要知道應使用哪些特定于數據庫的驅動程序類。 相反,它使用工廠方法來獲取連接,語句和其他可使用的對象。 這提供了更改后端數據庫的靈活性,而無需更改您的DAO層。
以下是SDK中的一些示例:
valueOf()方法,返回由工廠創建的對象,該對象與傳遞的參數值相等。 getInstance()方法,該方法創建Singleton類的實例。 newInstance()方法,該方法用于每次調用時從工廠方法創建和返回新實例。 下載示例代碼
參考: Idiotechie博客上來自JCG合作伙伴 Mainak Goswami的使用Factory Method Pattern設計最佳實踐 。
翻譯自: https://www.javacodegeeks.com/2012/10/design-best-practices-using-factory-method-pattern.html