设计模式 工厂方法_使用工厂方法模式设计最佳实践
設(shè)計(jì)模式 工廠方法
在前面的“設(shè)計(jì)模式”示例中,我們解釋了當(dāng)今常用的“工廠”模式。 在本節(jié)中,我們將了解具有更多抽象的更高級(jí)的解決方案。 該模式稱為工廠方法設(shè)計(jì)模式。
| Factory方法模式提供了一種用于創(chuàng)建對(duì)象的方法,但是將對(duì)象創(chuàng)建委托給了子類。 工廠方法設(shè)計(jì)模式以類似于工廠模式的方式解決了這些問題,并附加了抽象級(jí)別。 |
可以使用new關(guān)鍵字實(shí)例化該對(duì)象。 例如,對(duì)象A使用以下方法創(chuàng)建另一個(gè)對(duì)象B:
ClassB objB = new ClassB();因此,對(duì)象A擁有對(duì)對(duì)象B的引用。
對(duì)象實(shí)例化對(duì)象實(shí)例化
由于對(duì)象A現(xiàn)在依賴于對(duì)象B(如果后來(lái)對(duì)其進(jìn)行了修改),那么我們將不得不重新編譯對(duì)象A。 對(duì)象的創(chuàng)建可能更加復(fù)雜,如果存在更多的耦合,那么維護(hù)將是軟件開發(fā)中一項(xiàng)痛苦而昂貴的工作。
為了避免這種最壞的情況,我們提供了新穎的設(shè)計(jì)模式來(lái)進(jìn)行救援。 他們?cè)噲D在客戶端和對(duì)象創(chuàng)建者之間創(chuàng)建松散的耦合,并為開發(fā)者提供其他一些設(shè)計(jì)優(yōu)勢(shì)。 Factory Method模式就是解決設(shè)計(jì)問題的一種模式。
| 工廠方法設(shè)計(jì)模式通常與裝飾器設(shè)計(jì)模式一起用于各種框架(例如Struts,Spring,Apache)中。 有許多基于此Factory模式的J2EE模式,例如DAO模式。 |
讓我們以服裝工廠為例,我們正在創(chuàng)建各種類型的服裝,但是客戶完全不知道這些產(chǎn)品是如何創(chuàng)建的。 即使我們必須添加新的服裝類型(例如夾克),也無(wú)需更改客戶端代碼,從而增加了應(yīng)用程序的靈活性。
工廠模式類圖
何時(shí)使用工廠方法模式?
- 對(duì)象的創(chuàng)建需要代碼的重用,而無(wú)需大量重復(fù)代碼。
- 一個(gè)類將不知道需要?jiǎng)?chuàng)建哪些子類。
- 子類可以指定應(yīng)創(chuàng)建哪些對(duì)象。
- 父類將把對(duì)象的創(chuàng)建委托給它的子類。
結(jié)構(gòu)體
下圖突出顯示了工廠方法設(shè)計(jì)模式的典型結(jié)構(gòu)。 與上述示例不同,已添加了一個(gè)附加的Factory Abstract(Factory)類。
工廠方法設(shè)計(jì)模式(UML)
在上圖中,以下是參與者:
- 產(chǎn)品:這為工廠方法創(chuàng)建的對(duì)象定義了一個(gè)接口。
- 具體產(chǎn)品:實(shí)現(xiàn)產(chǎn)品接口。
- 工廠(創(chuàng)建者):這是一個(gè)抽象類,定義了返回產(chǎn)品對(duì)象的工廠方法。
- 具體工廠:此類實(shí)現(xiàn)并覆蓋由父工廠類聲明的方法。
客戶(例如,對(duì)象類A)將要使用由ConcreteFactory類(對(duì)象類B)創(chuàng)建的產(chǎn)品。 但是,在這種情況下,客戶端僅持有對(duì)接口B的引用,而不是對(duì)象“類B”,因此它不需要了解有關(guān)類B的任何信息。 實(shí)際上,可以有多個(gè)類可以實(shí)現(xiàn)抽象類。
| Factory Method模式允許子類決定實(shí)例化哪個(gè)類的含義是什么? |
| 從根本上講,這意味著對(duì)工廠抽象類進(jìn)行編碼,而無(wú)需知道將實(shí)例化哪些實(shí)際的ConcreteProduct類,即它是Trouser還是Shirt。 這完全由ConcreteFactory類確定。 |
現(xiàn)在,將上述模式實(shí)現(xiàn)到我們的GarmentFactory示例中。
工廠方法示例
讓我們開始吧。 我們不會(huì)重復(fù)在Factory Pattern文章中找到的具體產(chǎn)品的代碼,例如Shirt.java和Trouser.java。
已創(chuàng)建一個(gè)面向客戶的新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類,并對(duì)Factory的createGarments(selection)方法進(jìn)行分類,以在運(yùn)行時(shí)創(chuàng)建產(chǎn)品。
Factory factory = new GarmentFactory(); GarmentType objGarmentType = factory.createGarments(selection); System.out.println(objGarmentType.print());
優(yōu)點(diǎn):
- 通過(guò)將對(duì)象創(chuàng)建從客戶端代碼移到Factory類及其子類,代碼可以靈活,松耦合和可重用。 由于異議創(chuàng)建是集中的,因此維護(hù)此類代碼更加容易。
- 客戶代碼僅處理產(chǎn)品接口,因此可以在不修改客戶代碼邏輯的情況下添加任何具體產(chǎn)品。
- Factory Method的優(yōu)點(diǎn)是它可以多次返回相同的實(shí)例,或者可以返回子類而不是該確切類型的對(duì)象。
- 它通過(guò)工廠創(chuàng)建對(duì)象來(lái)鼓勵(lì)代碼的一致性,該工廠強(qiáng)制執(zhí)行每個(gè)人都必須遵循的一組明確規(guī)則。 這樣可以避免在不同的客戶端使用不同的構(gòu)造函數(shù)。
例:
JDBC是這種模式的一個(gè)很好的例子。 應(yīng)用程序代碼不需要知道它將與哪個(gè)數(shù)據(jù)庫(kù)一起使用,因此它也不知道應(yīng)使用哪個(gè)特定于數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序類。 相反,它使用工廠方法來(lái)獲取Connections,Statement和其他對(duì)象。 這提供了更改后端數(shù)據(jù)庫(kù)的靈活性,而無(wú)需更改您的DAO層。
以下是SDK中的一些示例:
valueOf()方法,返回由工廠創(chuàng)建的對(duì)象,該對(duì)象與傳遞的參數(shù)值相等。 getInstance()方法,該方法創(chuàng)建Singleton類的實(shí)例。 newInstance()方法,該方法用于每次調(diào)用時(shí)從工廠方法創(chuàng)建和返回新實(shí)例。 下載示例代碼
參考: Idiotechie博客上來(lái)自JCG合作伙伴 Mainak Goswami的使用Factory Method Pattern設(shè)計(jì)最佳實(shí)踐 。
翻譯自: https://www.javacodegeeks.com/2012/10/design-best-practices-using-factory-method-pattern.html
設(shè)計(jì)模式 工廠方法
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的设计模式 工厂方法_使用工厂方法模式设计最佳实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone 15 Pro系列发布,钛合
- 下一篇: 抽象工厂模式设计模式_抽象工厂设计模式解