以Java代碼為例講解設(shè)計模式中的簡單工廠模式
1. 簡單工廠模式簡介
簡單工廠模式(Simple Factory),又被稱為"靜態(tài)工廠方法模式"。它屬于"創(chuàng)建模式"(創(chuàng)建對象的模式),并且是"工廠方法"模式的一種特殊實現(xiàn)。
通常,我們利用簡單工廠模式來進(jìn)行類的創(chuàng)建。例如,獲取線程池對象,就是通過簡單工廠模式來實現(xiàn)的。它的結(jié)構(gòu)圖如下所示:

工廠:工廠是簡單工廠模式的核心,提供了對外接口??蛻舳嘶蚱渌绦蛞@取Product對象,都是通過Factory的接口來獲取的。
抽象產(chǎn)品:抽象產(chǎn)品是(許多)不同產(chǎn)品抽象出來的。Product可以是接口或者抽象類。
具體產(chǎn)品:工廠中返回的產(chǎn)品對象,實際上是通過ConcreteProduct來創(chuàng)建的。
2. 簡單工廠模式代碼模型
public class Factory {
public static Product newInstance() {
return new ConcreteProduct();
}
}
public abstract Product {
}
public class ConcreteProduct extends Product {
public ConcreteProduct() {}
}
模型的類圖

3.簡單工廠模式的實際應(yīng)用
我們在寫一個Servlet處理客戶端請求的時候, 往往會一個Servlet處理多個業(yè)務(wù)邏輯, 比如:
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
String flag = request.getParameter("flag");
if(flag.equals("service1")) {
service1();
}else if(flag.equals("service2")) {
service2();
}
...
}
以上是我們的Servlet處理多業(yè)務(wù)邏輯的常規(guī)方法, 寫一坨if else語句。一種比較好的辦法就是, 將請求的分發(fā)與Servlet分離, 讓Servlet只處理業(yè)務(wù)邏輯。我們把各種請求的Servlet看做產(chǎn)品類, javax.servlet.HttpServlet是產(chǎn)品父類, javax.servlet.Servlet是產(chǎn)品接口, 這樣我們定義一個ServletFactory, 在過濾器里解析url請求并交給ServletFactory來處理就可以了。 這就是一個典型的簡單工廠應(yīng)用。
@WebFilter("/TransRequest")
public class TransRequest implements Filter{
private String servletName;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest myRequest = (HttpServletRequest)request;
//拿到請求的servlet名字, 這里我們約定請求都是/servletName形式
String names[] = myRequest.getRequestURI().trim().split("/");
servletName = names[2];
if( servletName != null) {
//以下是最典型的兩句簡單工廠的例子
Servlet servlet = ServletFactory.createServlet(servletName);
servlet.service(request, response);
}else
chain.doFilter(request, response);
}
每次來一個請求我們用工廠生產(chǎn)一個servlet, 這樣可以免去在xml配置大量的servlet路徑信息比較方便。而且這樣也會使邏輯更加清晰, servlet僅僅就是在業(yè)務(wù)層處理業(yè)務(wù)。
工廠類如下:
public class ServletFactory {
public static Servlet createServlet(String servletName) throws ServletException {
if(servletName.equals("servletName1")) {
return new Service1();
}else if(servletName.equals("servletName2")){
return new Service2();
}else{
throw new ServletException("No such servlet");
}
}
}
上面的工廠類雖然沒有拋開繁瑣的if else, 但是利用簡單工廠的思想仍然解決了一些問題。簡單工廠是非常簡單的一種算不上設(shè)計模式的設(shè)計模式, 解決的問題也很有限。 以上請求分發(fā)各大javaEE 框架都已實現(xiàn), 例如Struts2, 當(dāng)然框架不是用的簡單工廠。
4.總結(jié)
簡單工廠模式, 總結(jié)起來就是一個工廠類,一個產(chǎn)品接口(其實也可以是一個抽象類,甚至一個普通的父類)和一群實現(xiàn)了產(chǎn)品接口的具體產(chǎn)品,而這個工廠類,根據(jù)傳入的參數(shù)去創(chuàng)造一個具體的實現(xiàn)類,并向上轉(zhuǎn)型為接口作為結(jié)果返回。
相關(guān)文章
springboot中自定義異常以及定制異常界面實現(xiàn)過程解析
這篇文章主要介紹了springboot中自定義異常以及定制異常界面實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
elasticsearch如何根據(jù)條件刪除數(shù)據(jù)
Elasticsearch是一個基于Apache Lucene?的開源搜索引擎,無論在開源還是專有領(lǐng)域,Lucene 可以被認(rèn)為是迄今為止最先進(jìn)、性能最好的、功能最全的搜索引擎庫,這篇文章主要介紹了elasticsearch如何根據(jù)條件刪除數(shù)據(jù),需要的朋友可以參考下2023-03-03
教你通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引
大家都知道B+Tree是從二叉樹演化而來,在這之前我們來先了解二叉樹、平衡二叉樹、平衡多叉樹,這篇文章主要介紹了通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引,需要的朋友可以參考下2022-01-01
java使用websocket,并且獲取HttpSession 源碼分析(推薦)
這篇文章主要介紹了java使用websocket,并且獲取HttpSession,通過使用配置源碼分析了各方面知識點,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。2017-08-08

