最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

以Java代碼為例講解設(shè)計(jì)模式中的簡(jiǎn)單工廠模式

 更新時(shí)間:2016年05月12日 09:43:22   作者:kuiwu-wang  
簡(jiǎn)單來(lái)說(shuō),工廠模式就是按照需求來(lái)返回一個(gè)類型的對(duì)象,使用工廠模式的意義就是,如果對(duì)象的實(shí)例化與代碼依賴太大的話,不方便進(jìn)行擴(kuò)展和維護(hù),使用工廠的目的就是使對(duì)象的實(shí)例化與主程序代碼就行解耦.來(lái)具體看一下:

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

201651294056383.jpg (280×151)

工廠:工廠是簡(jiǎn)單工廠模式的核心,提供了對(duì)外接口??蛻舳嘶蚱渌绦蛞@取Product對(duì)象,都是通過(guò)Factory的接口來(lái)獲取的。
抽象產(chǎn)品:抽象產(chǎn)品是(許多)不同產(chǎn)品抽象出來(lái)的。Product可以是接口或者抽象類。
具體產(chǎn)品:工廠中返回的產(chǎn)品對(duì)象,實(shí)際上是通過(guò)ConcreteProduct來(lái)創(chuàng)建的。

2. 簡(jiǎn)單工廠模式代碼模型

public class Factory {
 public static Product newInstance() {
  return new ConcreteProduct();
 }
}
public abstract Product {
}
public class ConcreteProduct extends Product {
 public ConcreteProduct() {}
}

模型的類圖

201651294129206.jpg (361×151)

3.簡(jiǎn)單工廠模式的實(shí)際應(yīng)用

我們?cè)趯懸粋€(gè)Servlet處理客戶端請(qǐng)求的時(shí)候, 往往會(huì)一個(gè)Servlet處理多個(gè)業(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語(yǔ)句。一種比較好的辦法就是, 將請(qǐng)求的分發(fā)與Servlet分離, 讓Servlet只處理業(yè)務(wù)邏輯。我們把各種請(qǐng)求的Servlet看做產(chǎn)品類, javax.servlet.HttpServlet是產(chǎn)品父類, javax.servlet.Servlet是產(chǎn)品接口, 這樣我們定義一個(gè)ServletFactory, 在過(guò)濾器里解析url請(qǐng)求并交給ServletFactory來(lái)處理就可以了。 這就是一個(gè)典型的簡(jiǎn)單工廠應(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;
  //拿到請(qǐng)求的servlet名字, 這里我們約定請(qǐng)求都是/servletName形式
  String names[] = myRequest.getRequestURI().trim().split("/");
  servletName = names[2];
  if( servletName != null) {
  //以下是最典型的兩句簡(jiǎn)單工廠的例子
   Servlet servlet = ServletFactory.createServlet(servletName);
   servlet.service(request, response);
  }else
   chain.doFilter(request, response);
 }

每次來(lái)一個(gè)請(qǐng)求我們用工廠生產(chǎn)一個(gè)servlet, 這樣可以免去在xml配置大量的servlet路徑信息比較方便。而且這樣也會(huì)使邏輯更加清晰, 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");
  }
 }
}

上面的工廠類雖然沒(méi)有拋開繁瑣的if else, 但是利用簡(jiǎn)單工廠的思想仍然解決了一些問(wèn)題。簡(jiǎn)單工廠是非常簡(jiǎn)單的一種算不上設(shè)計(jì)模式的設(shè)計(jì)模式, 解決的問(wèn)題也很有限。 以上請(qǐng)求分發(fā)各大javaEE 框架都已實(shí)現(xiàn), 例如Struts2, 當(dāng)然框架不是用的簡(jiǎn)單工廠。

4.總結(jié)

簡(jiǎn)單工廠模式, 總結(jié)起來(lái)就是一個(gè)工廠類,一個(gè)產(chǎn)品接口(其實(shí)也可以是一個(gè)抽象類,甚至一個(gè)普通的父類)和一群實(shí)現(xiàn)了產(chǎn)品接口的具體產(chǎn)品,而這個(gè)工廠類,根據(jù)傳入的參數(shù)去創(chuàng)造一個(gè)具體的實(shí)現(xiàn)類,并向上轉(zhuǎn)型為接口作為結(jié)果返回。

相關(guān)文章

  • springboot中自定義異常以及定制異常界面實(shí)現(xiàn)過(guò)程解析

    springboot中自定義異常以及定制異常界面實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了springboot中自定義異常以及定制異常界面實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解Spring如何解決循環(huán)引用的問(wèn)題

    詳解Spring如何解決循環(huán)引用的問(wèn)題

    在Spring框架中,當(dāng)兩個(gè)或多個(gè)Bean之間存在相互依賴關(guān)系時(shí),可能會(huì)導(dǎo)致循環(huán)引用的問(wèn)題,循環(huán)引用指的是兩個(gè)或多個(gè)Bean之間互相依賴,形成一個(gè)循環(huán)鏈,本文將和大家一起探討Spring如何解決循環(huán)引用的問(wèn)題,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-08-08
  • elasticsearch如何根據(jù)條件刪除數(shù)據(jù)

    elasticsearch如何根據(jù)條件刪除數(shù)據(jù)

    Elasticsearch是一個(gè)基于Apache Lucene?的開源搜索引擎,無(wú)論在開源還是專有領(lǐng)域,Lucene 可以被認(rèn)為是迄今為止最先進(jìn)、性能最好的、功能最全的搜索引擎庫(kù),這篇文章主要介紹了elasticsearch如何根據(jù)條件刪除數(shù)據(jù),需要的朋友可以參考下
    2023-03-03
  • 一篇文章帶你搞定JAVA注解

    一篇文章帶你搞定JAVA注解

    這篇文章主要介紹了詳解Java注解的實(shí)現(xiàn)與使用方法的相關(guān)資料,希望通過(guò)本文大家能夠理解掌握J(rèn)ava注解的知識(shí),需要的朋友可以參考下
    2021-07-07
  • Java 鎖粗化與循環(huán)問(wèn)題

    Java 鎖粗化與循環(huán)問(wèn)題

    這篇文章主要介紹了Java 鎖粗化與循環(huán)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • RabbitMQ消息隊(duì)列之持久化機(jī)制詳解

    RabbitMQ消息隊(duì)列之持久化機(jī)制詳解

    這篇文章主要介紹了RabbitMQ消息隊(duì)列之持久化機(jī)制詳解,持久化,即將原本存在于內(nèi)存中的數(shù)據(jù)寫入到磁盤上永久保存數(shù)據(jù),防止服務(wù)宕機(jī)時(shí)內(nèi)存數(shù)據(jù)的丟失,Rabbitmq 的持久化分為隊(duì)列持久化、消息持久化和交換器持久化,需要的朋友可以參考下
    2023-08-08
  • mybatis空值插入處理的解決方法

    mybatis空值插入處理的解決方法

    本文主要介紹了mybatis空值插入處理的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 教你通過(guò)B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引

    教你通過(guò)B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引

    大家都知道B+Tree是從二叉樹演化而來(lái),在這之前我們來(lái)先了解二叉樹、平衡二叉樹、平衡多叉樹,這篇文章主要介紹了通過(guò)B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引,需要的朋友可以參考下
    2022-01-01
  • SpringMVC靜態(tài)資源訪問(wèn)問(wèn)題如何解決

    SpringMVC靜態(tài)資源訪問(wèn)問(wèn)題如何解決

    這篇文章主要介紹了SpringMVC靜態(tài)資源訪問(wèn)問(wèn)題如何解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java使用websocket,并且獲取HttpSession 源碼分析(推薦)

    java使用websocket,并且獲取HttpSession 源碼分析(推薦)

    這篇文章主要介紹了java使用websocket,并且獲取HttpSession,通過(guò)使用配置源碼分析了各方面知識(shí)點(diǎn),具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。
    2017-08-08

最新評(píng)論

千阳县| 喀喇| 萨嘎县| 屏边| 平和县| 钦州市| 玉树县| 永泰县| 普格县| 石棉县| 扬州市| 神农架林区| 吴桥县| 柞水县| 镇远县| 罗山县| 嵩明县| 云浮市| 榕江县| 隆昌县| 武义县| 彰化县| 靖州| 云安县| 鹰潭市| 铁力市| 玉田县| 通海县| 吉林省| 锦屏县| 江都市| 井研县| 专栏| 舞阳县| 通榆县| 六枝特区| 巴东县| 克东县| 井研县| 托里县| 乌拉特后旗|