成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java設(shè)計(jì)模式之(二)——工廠模式

Doyle / 3077人閱讀

摘要:需要說(shuō)明的是在設(shè)計(jì)模式一書(shū)中將工廠模式分為兩類(lèi)工廠方法模式與抽象工廠模式,將簡(jiǎn)單工廠模式看為工廠方法模式的一種特例,兩者歸為一類(lèi)。工廠模式的作用工廠模式的作用封裝變化創(chuàng)建邏輯有可能變化,封裝成工廠類(lèi)之后,創(chuàng)建邏輯的變更對(duì)調(diào)用者透明。

1、什么是工廠模式

Define an interface for creating an object,but let subclasses decide which class toinstantiate.Factory Method lets a class defer instantiation to subclasses.

定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類(lèi)自己決定實(shí)例化哪一個(gè)工廠類(lèi),工廠模式使其創(chuàng)建過(guò)程延遲到子類(lèi)進(jìn)行。

說(shuō)人話:提供創(chuàng)建對(duì)象的接口,將創(chuàng)建對(duì)象的過(guò)程屏蔽,從而達(dá)到靈活的目的。

2、工廠模式分類(lèi)

一般情況下,工廠模式分為三類(lèi):

①、簡(jiǎn)單工廠模式(Simple Factory)

②、工廠方法模式(Factory Method)

③、抽象工廠模式(Abstract Factory)

這三種模式從上到下逐步抽象,并且更具一般性。

需要說(shuō)明的是:GOF 在《設(shè)計(jì)模式》一書(shū)中將工廠模式分為兩類(lèi):工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory),將簡(jiǎn)單工廠模式(Simple Factory)看為工廠方法模式的一種特例,兩者歸為一類(lèi)。

下面我們分別介紹這三種工廠模式。

2.1 簡(jiǎn)單工廠(Simple Factory)

比如有這樣一個(gè)需求:

根據(jù)導(dǎo)入的不同文件(docx,xlsx,pptx),選擇不同的解析器進(jìn)行解析。

簡(jiǎn)單工廠有三個(gè)核心對(duì)象:

1.工廠:簡(jiǎn)單工廠模式的核心,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類(lèi)的創(chuàng)建產(chǎn)品類(lèi)的方法可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對(duì)象。

2.抽象產(chǎn)品 :簡(jiǎn)單工廠模式所創(chuàng)建的所有對(duì)象的父類(lèi),它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。

3.具體產(chǎn)品:是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo),所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類(lèi)的實(shí)例。

①、抽象解析器

public interface IOfficeParser {    void parse();}

②、具體解析器(docx,xlsx,pptx)

public class WordParser implements IOfficeParser{    private String filePath;    public WordParser(String filePath){        this.filePath = filePath;    }    @Override    public void parse() {        System.out.println("解析 docx 文件");    }}
public class ExcelParser implements IOfficeParser{    private String filePath;    public ExcelParser(String filePath){        this.filePath = filePath;    }    @Override    public void parse() {        System.out.println("解析 xlsx 文件");    }}
public class PptParser implements IOfficeParser {    private String filePath;    public PptParser(String filePath){        this.filePath = filePath;    }    @Override    public void parse() {        System.out.println("解析 pptx 文件");    }}

③、構(gòu)造解析器的工廠

public class OfficeParserFactory {    public static IOfficeParser getParser(String filePath) throws Exception {        String fileExtension = getFileExtension(filePath);        IOfficeParser parser = null;        if("docx".equalsIgnoreCase(fileExtension)){            parser = new WordParser(filePath);        }else if("xlsx".equalsIgnoreCase(fileExtension)){            parser = new ExcelParser(filePath);        }else if("pptx".equalsIgnoreCase(fileExtension)){            parser = new PptParser(filePath);        }else{            throw new Exception("file is not supported:"+fileExtension);        }        return parser;    }    private static String getFileExtension(String filePath){        // 解析文件名獲取文件擴(kuò)展名,比如 文檔.docx,返回 docx        String fileExtension = filePath.substring(filePath.lastIndexOf(".")+1);        return fileExtension;    }}

④、測(cè)試類(lèi)

public class SimpleFactoryTest {    public static void main(String[] args) throws Exception {        String filePath = "文檔.docx";        IOfficeParser parser = OfficeParserFactory.getParser(filePath);        parser.parse();        String filePath1 = "表格.xlsx";        IOfficeParser parser1 = OfficeParserFactory.getParser(filePath1);        parser1.parse();    }}

⑤、總結(jié)

這便是簡(jiǎn)單工廠,客戶端避免了直接創(chuàng)建解析器的責(zé)任,只需要調(diào)用工廠類(lèi)去解析就行了。

可以從開(kāi)閉原則(對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉)來(lái)分析簡(jiǎn)單工廠模式:當(dāng)增加一種文件解析,比如老版本的 doc 格式。這時(shí)候只需要新增一個(gè) parser 類(lèi)即可,客戶端(理解為測(cè)試類(lèi),調(diào)用端)不用改變,然后在工廠類(lèi) OfficeParserFactory 新增一個(gè) else-if 分支即可。

這時(shí)候可能有同學(xué)會(huì)問(wèn)了,那修改了 OfficeParserFactory 類(lèi),不就違反開(kāi)閉原則了嗎?但其實(shí)只要不是頻繁的添加新的 parser,偶爾修改一下 OfficeParserFactory 類(lèi),稍微不符合開(kāi)閉原則,也是可以接受的。

看上去比較完美,細(xì)心的同學(xué)可能會(huì)問(wèn),所有的解析類(lèi)對(duì)象創(chuàng)建都在 OfficeParserFactory 類(lèi)中,假設(shè)某個(gè)解析類(lèi),比如 doc 創(chuàng)建parser 對(duì)象并不是簡(jiǎn)單的 new ,還包括一些其它的操作,這時(shí)候難道把這些代碼也全部寫(xiě)到 OfficeParserFactory 中嗎?有沒(méi)有更優(yōu)雅的寫(xiě)法呢?

有,就是下面要介紹的 工廠模式。

2.2 工廠方法(Factory Method)

為了解決上面的問(wèn)題,我們可以為工廠類(lèi)在創(chuàng)建一個(gè)工廠,也就是工廠的工廠,用來(lái)創(chuàng)建工廠類(lèi)對(duì)象。

①、給每一個(gè)具體解析器創(chuàng)建工廠

public class ExcelParserFactory implements IOfficeParserFactory {    @Override    public IOfficeParser createParser() {        // TODO 進(jìn)行創(chuàng)建對(duì)象的一些操作        return new ExcelParser();    }}

②、創(chuàng)建解析器的工廠

public class OfficeParserFactory {    public static IOfficeParser getParser(String filePath) throws Exception {        String fileExtension = getFileExtension(filePath);        IOfficeParserFactory parserFactory = OfficeParserFactoryMap.getOfficeParseFactory(fileExtension);        if(parserFactory == null){            throw new Exception("file is not supported:"+fileExtension);        }        IOfficeParser parser = parserFactory.createParser();        return parser;    }    private static String getFileExtension(String filePath){        // 解析文件名獲取文件擴(kuò)展名,比如 文檔.docx,返回 docx        String fileExtension = filePath.substring(filePath.lastIndexOf(".")+1);        return fileExtension;    }}

③、創(chuàng)建解析器工廠的工廠類(lèi)

public class OfficeParserFactoryMap {    private static final Map parserFactoryCached = new HashMap<>();    static {        parserFactoryCached.put("docx",new WordParserFactory());        parserFactoryCached.put("xlxs",new ExcelParserFactory());        parserFactoryCached.put("pptx",new PptParserFactory());    }    public static IOfficeParserFactory getOfficeParseFactory(String type){        if(type == null || type.isEmpty()){            return null;        }        return parserFactoryCached.get(type.toLowerCase());    }}

④、測(cè)試類(lèi)

public class FactoryTest {    public static void main(String[] args) throws Exception {        String filePath = "文檔.docx";        IOfficeParser parser = OfficeParserFactory.getParser(filePath);        parser.parse();    }}

⑤、總結(jié)

在工廠模式中,如果我們要增加新的文件解析,比如 mdb 格式(office access套件),就只需要?jiǎng)?chuàng)建新的 parser 類(lèi)和 parserFactory 類(lèi),并且在 OfficeParserFactoryMap 類(lèi)中將新的 parserFactory 類(lèi)添加到 map 中即可。代碼的改動(dòng)非常少,基本上是符合開(kāi)閉原則的。

但是,我們看到工廠模式新增了很多 factory 類(lèi),會(huì)增加代碼的復(fù)制性,如果每個(gè) factory 類(lèi)只是做簡(jiǎn)單的 new 操作,則沒(méi)必要使用該模式,直接用簡(jiǎn)單工廠模式即可。

2.3 抽象工廠(Abstract Factory)

這種模式比較特殊,使用場(chǎng)景不多,大家簡(jiǎn)單了解一下就行。

我們知道 doc 和 docx 都是 office word 文檔后綴,類(lèi)似 xls 和 xlsx 都是 office Excel 表格后綴,還有 ppt 和 pptx。doc/xlx/ppt 都是舊版本 office 文件后綴,都是二進(jìn)制組成,解析的時(shí)候有共同之處,而 docx/xlsx/pptx 是office新版本文件后綴,是通過(guò) ooxml 結(jié)構(gòu)組成。相當(dāng)于一組是老的office,一組是新的office。

如果我們還是用工廠模式來(lái)實(shí)現(xiàn)的話,那每一種都要編寫(xiě)一個(gè)工廠類(lèi),過(guò)多的類(lèi)會(huì)難以維護(hù),那怎么解決呢?

抽象工廠模式就是針對(duì)這種特殊的場(chǎng)景誕生,我們可以讓一個(gè)工廠復(fù)制創(chuàng)建多個(gè)不同類(lèi)型的對(duì)象,而不是只創(chuàng)建一個(gè) parser 對(duì)象。

具體代碼實(shí)現(xiàn)如下:

public interface IOfficeParserFactory {    IOfficeParser createParser();    IOldOfficeParser createOldParser();}
public class ExcelParserFactory implements IOfficeParserFactory {    @Override    public IOfficeParser createParser() {        return new ExcelParser();    }    @Override    public IOldOfficeParser createOldParser() {        return new DocParser();    }}

3、簡(jiǎn)單工廠和工廠方法區(qū)別

簡(jiǎn)單工廠:將創(chuàng)建不同對(duì)象的邏輯放在一個(gè)工廠類(lèi)中。

工廠方法:將創(chuàng)建不同對(duì)象的邏輯放在不同工廠類(lèi)中,先用一個(gè)工廠類(lèi)的工廠類(lèi)得到某個(gè)工廠,在某這個(gè)工廠來(lái)創(chuàng)建對(duì)象。

這樣講區(qū)別就很明顯了,如果創(chuàng)建對(duì)象的邏輯比較復(fù)雜,要做各種初始化操作,這時(shí)候使用工廠方法,能夠?qū)?fù)雜的創(chuàng)建邏輯拆分到多個(gè)工廠類(lèi)中;而創(chuàng)建對(duì)象的邏輯很簡(jiǎn)單,就沒(méi)必要額外創(chuàng)建多個(gè)工廠類(lèi),直接使用簡(jiǎn)單工廠即可。

4、工廠模式的作用

封裝變化:創(chuàng)建邏輯有可能變化,封裝成工廠類(lèi)之后,創(chuàng)建邏輯的變更對(duì)調(diào)用者透明。

代碼復(fù)用:創(chuàng)建代碼抽離到獨(dú)立的工廠類(lèi)之后可以復(fù)用。

隔離復(fù)雜性:封裝復(fù)雜的創(chuàng)建邏輯,調(diào)用者無(wú)需了解如何創(chuàng)建對(duì)象。

控制復(fù)雜度:將創(chuàng)建代碼抽離出來(lái),讓原本的函數(shù)或類(lèi)職責(zé)更單一,代碼更簡(jiǎn)潔。

看完知道為啥沒(méi)事別用工廠模式了吧,因?yàn)樘糜昧?,你?huì)愛(ài)上它的。

作者:IT可樂(lè)

資源:微信搜【IT可樂(lè)】關(guān)注我,回復(fù) 【電子書(shū)】有我特別篩選的免費(fèi)電子書(shū)。
本文版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意不能轉(zhuǎn)載,否則保留追究法律責(zé)任的權(quán)利。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/123759.html

相關(guān)文章

  • Java - 收藏集 - 掘金

    摘要:強(qiáng)大的表單驗(yàn)證前端掘金支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,以及。面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別的種設(shè)計(jì)模式全解析后端掘金一設(shè)計(jì)模式的分類(lèi)總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類(lèi)創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強(qiáng)大的 Angular 表單驗(yàn)證 - 前端 - 掘金Angular 支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,maxlength、minlength、required 以及 patt...

    XiNGRZ 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    vspiders 評(píng)論0 收藏0
  • Java 設(shè)計(jì)模式工廠模式

    摘要:與以往的使用的方式不同,工廠模式使用工廠實(shí)例化對(duì)象。抽象工廠模式亮相抽象工廠模式抽象工廠模式提供一個(gè)接口,用于創(chuàng)建相關(guān)或依賴對(duì)象的家族,而不需要明確指定具體類(lèi)。 寫(xiě)在前面 這篇博文介紹設(shè)計(jì)模式的形式將與其他篇博文不太一樣,這里我們將從一個(gè)問(wèn)題入手,逐步了解到簡(jiǎn)單工廠、工廠方法與抽象工廠模式。 PS:這篇博文涉及的內(nèi)容較多,所以篇幅有點(diǎn)長(zhǎng),請(qǐng)耐心閱讀。 為什么要使用工廠模式? 在 OO ...

    Jochen 評(píng)論0 收藏0
  • 工廠模式理解了沒(méi)有?

    摘要:我認(rèn)為按書(shū)上的順序比較好理解因?yàn)楹?jiǎn)單靜態(tài)工廠模式是在工廠方法模式上縮減,抽象工廠模式是在工廠方法模式上再增強(qiáng)。所以我就先講工廠方法模式了。抽象工廠模式抽象工廠模式就比較復(fù)雜了,我們一般的應(yīng)用都寫(xiě)不到。 前言 只有光頭才能變強(qiáng) 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡(jiǎn)單啦 單例模式你會(huì)幾種寫(xiě)法? 昨天寫(xiě)了單例模式了,今天是時(shí)候?qū)懝S模式啦~ 工廠模式我個(gè)人認(rèn)為其實(shí)比...

    蘇丹 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<