一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 以Java代碼為例講解設計模式中的簡單工廠模式

以Java代碼為例講解設計模式中的簡單工廠模式

2020-04-28 11:03kuiwu-wang JAVA教程

簡單來說,工廠模式就是按照需求來返回一個類型的對象,使用工廠模式的意義就是,如果對象的實例化與代碼依賴太大的話,不方便進行擴展和維護,使用工廠的目的就是使對象的實例化與主程序代碼就行解耦.來具體看一下:

1. 簡單工廠模式簡介
簡單工廠模式(Simple Factory),又被稱為"靜態工廠方法模式"。它屬于"創建模式"(創建對象的模式),并且是"工廠方法"模式的一種特殊實現。
通常,我們利用簡單工廠模式來進行類的創建。例如,獲取線程池對象,就是通過簡單工廠模式來實現的。它的結構圖如下所示:

以Java代碼為例講解設計模式中的簡單工廠模式

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

2. 簡單工廠模式代碼模型

?
1
2
3
4
5
6
7
8
9
10
public class Factory {
 public static Product newInstance() {
  return new ConcreteProduct();
 }
}
public abstract Product {
}
public class ConcreteProduct extends Product {
 public ConcreteProduct() {}
}

模型的類圖

以Java代碼為例講解設計模式中的簡單工廠模式

 

3.簡單工廠模式的實際應用

我們在寫一個Servlet處理客戶端請求的時候, 往往會一個Servlet處理多個業務邏輯, 比如:

?
1
2
3
4
5
6
7
8
9
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
 String flag = request.getParameter("flag");
 if(flag.equals("service1")) {
  service1();
 }else if(flag.equals("service2")) {
  service2();
 }
 ...
}

以上是我們的Servlet處理多業務邏輯的常規方法, 寫一坨if else語句。一種比較好的辦法就是, 將請求的分發與Servlet分離, 讓Servlet只處理業務邏輯。我們把各種請求的Servlet看做產品類, javax.servlet.HttpServlet是產品父類, javax.servlet.Servlet是產品接口, 這樣我們定義一個ServletFactory, 在過濾器里解析url請求并交給ServletFactory來處理就可以了。 這就是一個典型的簡單工廠應用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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);
 }

每次來一個請求我們用工廠生產一個servlet, 這樣可以免去在xml配置大量的servlet路徑信息比較方便。而且這樣也會使邏輯更加清晰, servlet僅僅就是在業務層處理業務。
工廠類如下:

?
1
2
3
4
5
6
7
8
9
10
11
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, 但是利用簡單工廠的思想仍然解決了一些問題。簡單工廠是非常簡單的一種算不上設計模式的設計模式, 解決的問題也很有限。 以上請求分發各大javaEE 框架都已實現, 例如Struts2, 當然框架不是用的簡單工廠。

4.總結

簡單工廠模式, 總結起來就是一個工廠類,一個產品接口(其實也可以是一個抽象類,甚至一個普通的父類)和一群實現了產品接口的具體產品,而這個工廠類,根據傳入的參數去創造一個具體的實現類,并向上轉型為接口作為結果返回。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久无毒 | 欧美一区二区三区精品国产 | 成年人网站免费在线观看 | 欧美高清milf在线播放 | 99网站在线观看 | 91国内精品线免费播放 | 免费看日本 | 亚洲国产精品久久丫 | 午夜宅男网 | 国产自产自拍 | 国产成人精品免费视频大全五级 | 99在线精品视频 | 国产普通话对白露脸流出 | 楚乔传第二部免费完整 | 全彩成人18h漫画 | 日韩在线视频免费观看 | 深夜网站在线观看 | 久久机热免费视频 | 鬼畜重口高h合集长短篇 | 日本美女动态图片 | 午夜毛片在线观看 | 奇米影视777最新在线 | 国产va免费精品高清在线观看 | 久久免费国产视频 | 日本老妇人乱视频 | 冰雪奇缘1完整版免费观看 变形金刚第一部 | 亚洲视频一 | 国产成人精品一区二区仙踪林 | 国产精品视频视频久久 | 国产成人免费片在线视频观看 | 日本不卡免费新一二三区 | 国四虎影永久 | 久久婷婷五月综合色精品首页 | 国产精品香蕉 | 欧美激情综合 | 九九热视频免费观看 | 午夜家庭影院 | 午夜免费体验30分 | 亚洲精品国产一区二区三区在 | 成年男女免费大片在线观看 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 |