以Java代碼為例講授設計形式中的簡略工場形式。本站提示廣大學習愛好者:(以Java代碼為例講授設計形式中的簡略工場形式)文章只能為提供參考,不一定能成為您想要的結果。以下是以Java代碼為例講授設計形式中的簡略工場形式正文
1. 簡略工場形式簡介
簡略工場形式(Simple Factory),又被稱為"靜態工場辦法形式"。它屬於"創立形式"(創立對象的形式),而且是"工場辦法"形式的一種特別完成。
平日,我們應用簡略工場形式來停止類的創立。例如,獲得線程池對象,就是經由過程簡略工場形式來完成的。它的構造圖以下所示:
工場:工場是簡略工場形式的焦點,供給了對外接口。客戶端或其它法式要獲得Product對象,都是經由過程Factory的接口來獲得的。
籠統產物:籠統產物是(很多)分歧產物籠統出來的。Product可所以接口或許籠統類。
詳細產物:工場中前往的產物對象,現實上是經由過程ConcreteProduct來創立的。
2. 簡略工場形式代碼模子
public class Factory { public static Product newInstance() { return new ConcreteProduct(); } } public abstract Product { } public class ConcreteProduct extends Product { public ConcreteProduct() {} }
模子的類圖
3.簡略工場形式的現實運用
我們在寫一個Servlet處置客戶端要求的時刻, 常常會一個Servlet處置多個營業邏輯, 好比:
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來處置便可以了。 這就是一個典范的簡略工場運用。
@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僅僅就是在營業層處置營業。
工場類以下:
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.總結
簡略工場形式, 總結起來就是一個工場類,一個產物接口(其實也能夠是一個籠統類,乃至一個通俗的父類)和一群完成了產物接口的詳細產物,而這個工場類,依據傳入的參數去發明一個詳細的完成類,並向上轉型為接口作為成果前往。