成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

沒(méi)事最好不要用工廠模式

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

哈嘍,大家好,我是指北君。在軟件開(kāi)發(fā)過(guò)程中,我們會(huì)用到很多設(shè)計(jì)模式,之前介紹過(guò)的單例模式,還有后面會(huì)介紹的代理模式、適配器模式、建造者模式等等,合適的場(chǎng)景運(yùn)用合適的設(shè)計(jì)模式,你會(huì)發(fā)現(xiàn)業(yè)務(wù)邏輯會(huì)清晰很多。

但是對(duì)于工廠模式,我奉勸大家,沒(méi)事最好不要用,什么,你問(wèn)為啥?

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ì)象的接口,讓其子類自己決定實(shí)例化哪一個(gè)工廠類,工廠模式使其創(chuàng)建過(guò)程延遲到子類進(jìn)行。

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

2.工廠模式分類

一般情況下,工廠模式分為三類:

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

②工廠方法模式(Factory Method)

③抽象工廠模式(Abstract Factory)

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

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

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

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

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

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

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

  • 工廠:簡(jiǎn)單工廠模式的核心,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類的創(chuàng)建產(chǎn)品類的方法可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對(duì)象。
  • .抽象產(chǎn)品 :簡(jiǎn)單工廠模式所創(chuàng)建的所有對(duì)象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
  • 具體產(chǎn)品:是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo),所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類的實(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è)試類

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)用工廠類去解析就行了。

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

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

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

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

2.2 工廠方法(Factory Method)

為了解決上面的問(wèn)題,我們可以為工廠類在創(chuàng)建一個(gè)工廠,也就是工廠的工廠,用來(lái)創(chuàng)建工廠類對(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)建解析器工廠的工廠類

public class OfficeParserFactoryMap {
private static final Map<String, IOfficeParserFactory> 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è)試類

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 類和 parserFactory 類,并且在 OfficeParserFactoryMap 類中將新的 parserFactory 類添加到 map 中即可。代碼的改動(dòng)非常少,基本上是符合開(kāi)閉原則的。

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

2.3 抽象工廠(Abstract Factory)

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

我們知道 doc 和 docx 都是 office word 文檔后綴,類似 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è)工廠類,過(guò)多的類會(huì)難以維護(hù),那怎么解決呢?

抽象工廠模式就是針對(duì)這種特殊的場(chǎng)景誕生,我們可以讓一個(gè)工廠復(fù)制創(chuàng)建多個(gè)不同類型的對(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è)工廠類中。

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

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

4.工廠模式的作用

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

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

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

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

責(zé)任編輯:武曉燕 來(lái)源: Java技術(shù)指北
相關(guān)推薦

2011-12-07 10:26:51

唐駿云計(jì)算

2021-03-06 22:50:58

設(shè)計(jì)模式抽象

2016-11-21 20:11:15

蘋(píng)果iPhone生產(chǎn)線

2011-11-17 16:03:05

Java工廠模式Clojure

2021-04-20 08:53:51

工廠模式電商公司設(shè)計(jì)模式

2016-10-21 10:00:01

HTML標(biāo)簽WEB

2021-01-20 07:28:02

nullcollections對(duì)象

2024-03-06 13:19:19

工廠模式Python函數(shù)

2020-08-21 07:23:50

工廠模式設(shè)計(jì)

2022-01-12 13:33:25

工廠模式設(shè)計(jì)

2023-04-27 13:25:22

索引合并MySQL

2023-02-26 15:49:08

元宇宙ChatGPT

2018-03-12 10:57:14

JavaKotlin語(yǔ)法

2021-09-29 13:53:17

抽象工廠模式

2020-10-19 09:28:00

抽象工廠模式

2009-01-15 10:55:29

JavaScript設(shè)計(jì)模式抽象工廠

2015-08-04 08:56:14

swift子類

2022-05-09 08:04:50

工廠模式設(shè)計(jì)模式

2010-04-19 09:30:00

工廠模式PHP設(shè)計(jì)模式

2013-11-26 16:29:22

Android設(shè)計(jì)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品第一国产综合野 | 中文精品视频 | 日批免费观看 | 欧美aⅴ| 成人在线播放网站 | 久久精品久久久久久 | 久久亚洲一区 | 中文字幕国产视频 | 国产精品视频一二三区 | 国产高清性xxxxxxxx | 日韩高清国产一区在线 | 国产综合在线视频 | 日韩精品成人免费观看视频 | 亚洲精品二区 | 国产精品久久亚洲 | 免费激情 | a中文在线视频 | 天天草天天干天天 | 日韩电影一区二区三区 | 欧美极品在线观看 | 精品久久久久久久久亚洲 | 亚洲一区二区中文字幕在线观看 | 欧美国产日韩在线观看成人 | 国产精品久久久久久久久久妇女 | 2021天天干夜夜爽 | 国产熟熟 | 国产亚洲精品精品国产亚洲综合 | 中文字幕av在线播放 | 免费黄色片视频 | 久久新视频 | 99热播放| 国产清纯白嫩初高生视频在线观看 | 拍拍无遮挡人做人爱视频免费观看 | 中文字幕在线视频免费视频 | 欧美片网站免费 | 欧美日韩一区二区在线观看 | 久久久久久国产精品 | 视频在线观看亚洲 | 欧美久久久久 | 亚洲国产成人精品女人久久久 | 国产 91 视频|