Java設(shè)計(jì)模式之抽象工廠(chǎng)模式
一、場(chǎng)景描述
接《Java設(shè)計(jì)模式(一)工廠(chǎng)模式》
工廠(chǎng)模式有一缺點(diǎn),就是破壞了類(lèi)的封閉性原則。例如,如果需要增加Word文件的數(shù)據(jù)采集,此時(shí)按以下步驟操作:
- 創(chuàng)建Word文件數(shù)據(jù)采集類(lèi),實(shí)現(xiàn)儀器數(shù)據(jù)采集接口;
- 修改儀器數(shù)據(jù)采集工廠(chǎng)類(lèi),增加Word文件數(shù)據(jù)采集類(lèi)的工廠(chǎng)方法;
- 調(diào)用工廠(chǎng)類(lèi)的word文件方法;
步驟2修改了工廠(chǎng)類(lèi),如果每增加一實(shí)現(xiàn)類(lèi)都需要修改工廠(chǎng)類(lèi),那么這樣就不合理了。
解決辦法是使用抽象工廠(chǎng)類(lèi),為每一個(gè)實(shí)現(xiàn)類(lèi)都創(chuàng)建其工廠(chǎng)類(lèi),并增加工廠(chǎng)接口,使各工廠(chǎng)類(lèi)實(shí)現(xiàn)該接口。
使用抽象工廠(chǎng)后,上述步驟更改為:
- 創(chuàng)建Word文件數(shù)據(jù)采集類(lèi),實(shí)現(xiàn)儀器數(shù)據(jù)采集接口;
- 創(chuàng)建Word文件數(shù)據(jù)采集類(lèi)的工廠(chǎng)類(lèi),該類(lèi)實(shí)現(xiàn)工廠(chǎng)接口,接口方法創(chuàng)建Word文件數(shù)據(jù)采集類(lèi);
- 獲取Word文件數(shù)據(jù)采集類(lèi)的工廠(chǎng)類(lèi)對(duì)象,并調(diào)用工廠(chǎng)接口方法,創(chuàng)建類(lèi)對(duì)象,然后調(diào)用其方法。
修改后,由于對(duì)工廠(chǎng)類(lèi)進(jìn)行了抽象,定義了工廠(chǎng)接口,因此新增實(shí)現(xiàn)類(lèi)時(shí)不再需要修改原有代碼,不破壞原有實(shí)現(xiàn)。
如下圖所示:
二、示例代碼
儀器數(shù)據(jù)采集接口:
package lims.designpatterndemo.abstractfactorydemo; public interface EquipmentDataCapture { public String capture(String filePath); }
PDF文件采集類(lèi):
package lims.designpatterndemo.abstractfactorydemo; public class PdfFileCapture implements EquipmentDataCapture{ @Override public String capture(String filePath) { return "PDF file content"; } }
Excel文件采集類(lèi):
package lims.designpatterndemo.abstractfactorydemo; public class ExcelFileCapture implements EquipmentDataCapture{ @Override public String capture(String filePath) { return "Excel File Content"; } }
抽象工廠(chǎng),即工廠(chǎng)接口:
package lims.designpatterndemo.abstractfactorydemo; public interface EquipmentDataCaptureFactory { public EquipmentDataCapture getCapture(); }
PDF文件采集工廠(chǎng)類(lèi):
package lims.designpatterndemo.abstractfactorydemo; public class PdfFileCaptureFactory implements EquipmentDataCaptureFactory { @Override public EquipmentDataCapture getCapture() { return new PdfFileCapture(); } }
Excel文件采集工廠(chǎng)類(lèi):
package lims.designpatterndemo.abstractfactorydemo; public class ExcelFileCaptureFactory implements EquipmentDataCaptureFactory { @Override public EquipmentDataCapture getCapture() { return new ExcelFileCapture(); } }
調(diào)用示例:
package lims.designpatterndemo.abstractfactorydemo; public class AbstractFactoryDemo { public static void main(String[] args) { EquipmentDataCaptureFactory facotry = new PdfFileCaptureFactory(); facotry = new ExcelFileCaptureFactory(); EquipmentDataCapture capture = facotry.getCapture(); String fileContent = capture.capture(""); System.out.println(fileContent); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java創(chuàng)建型設(shè)計(jì)模式之抽象工廠(chǎng)模式(Abstract?Factory)
- Java設(shè)計(jì)模式之抽象工廠(chǎng)模式淺析講解
- Java設(shè)計(jì)模式之抽象工廠(chǎng)模式(Abstract?Factory)
- Java?深入理解創(chuàng)建型設(shè)計(jì)模式之抽象工廠(chǎng)模式
- 深入理解Java設(shè)計(jì)模式之抽象工廠(chǎng)模式
- Java設(shè)計(jì)模式之簡(jiǎn)單工廠(chǎng) 工廠(chǎng)方法 抽象工廠(chǎng)深度總結(jié)
- Java設(shè)計(jì)模式之抽象工廠(chǎng)模式詳解
- Java設(shè)計(jì)模式之工廠(chǎng)模式分析【簡(jiǎn)單工廠(chǎng)、工廠(chǎng)方法、抽象工廠(chǎng)】
- Java設(shè)計(jì)模式筆記之抽象工廠(chǎng)代碼示例
- Java設(shè)計(jì)模式之抽象工廠(chǎng)模式實(shí)例詳解
- Java設(shè)計(jì)模式編程中簡(jiǎn)單工廠(chǎng)與抽象工廠(chǎng)模式的使用實(shí)例
- Java設(shè)計(jì)模式編程中的工廠(chǎng)方法模式和抽象工廠(chǎng)模式
- Java設(shè)計(jì)模式之工廠(chǎng)方法和抽象工廠(chǎng)
相關(guān)文章
詳解HTTP請(qǐng)求與響應(yīng)基礎(chǔ)及實(shí)例
這篇文章主要介紹了詳解HTTP請(qǐng)求與響應(yīng)基礎(chǔ)及實(shí)例的相關(guān)資料,這里對(duì)http的請(qǐng)求和響應(yīng)進(jìn)行詳細(xì)分析并附有實(shí)現(xiàn)實(shí)例,需要的朋友可以參考下2017-07-07java.lang.String和java.util.NClob互相轉(zhuǎn)換方式
這篇文章主要介紹了java.lang.String和java.util.NClob互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09C++/java 繼承類(lèi)的多態(tài)詳解及實(shí)例代碼
這篇文章主要介紹了C++/java 繼承類(lèi)的多態(tài)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Java程序單實(shí)例運(yùn)行的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了Java程序單實(shí)例運(yùn)行的簡(jiǎn)單實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java編程關(guān)于子類(lèi)重寫(xiě)父類(lèi)方法問(wèn)題的理解
這篇文章主要介紹了Java編程關(guān)于子類(lèi)重寫(xiě)父類(lèi)方法問(wèn)題的理解,分享了有關(guān)子類(lèi)重寫(xiě)父類(lèi)的實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11java實(shí)現(xiàn)輕輕松松控制臺(tái)斗地主的示例代碼
這篇文章主要介紹了java實(shí)現(xiàn)輕輕松松控制臺(tái)斗地主,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04