首页 > Java > java教程 > 正文

以Java代码为例讲解设计模式中的简单工厂模式

黄舟
发布: 2017-01-20 11:18:04
原创
1593人浏览过

简单来说,工厂模式就是按照需求来返回一个类型的对象,使用工厂模式的意义就是,如果对象的实例化与代码依赖太大的话,不方便进行扩展和维护,使用工厂的目的就是使对象的实例化与主程序代码就行解耦.来具体看一下:

1. 简单工厂模式简介
简单工厂模式(Simple Factory),又被称为"静态工厂方法模式"。它属于"创建模式"(创建对象的模式),并且是"工厂方法"模式的一种特殊实现。
通常,我们利用简单工厂模式来进行类的创建。例如,获取线程池对象,就是通过简单工厂模式来实现的。它的结构图如下所示:

478.jpg

工厂:工厂是简单工厂模式的核心,提供了对外接口。客户端或其它程序要获取Product对象,都是通过Factory的接口来获取的。
抽象产品:抽象产品是(许多)不同产品抽象出来的。Product可以是接口或者抽象类。
具体产品:工厂中返回的产品对象,实际上是通过ConcreteProduct来创建的。

2. 简单工厂模式代码模型

立即学习Java免费学习笔记(深入)”;

public class Factory {
 public static Product newInstance() {
  return new ConcreteProduct();
 }
}
public abstract Product {
}
public class ConcreteProduct extends Product {
 public ConcreteProduct() {}
}
登录后复制

479.jpg

3.简单工厂模式的实际应用

我们在写一个Servlet处理客户端请求的时候, 往往会一个Servlet处理多个业务逻辑, 比如:

启科网络PHP商城系统
启科网络PHP商城系统

启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。

启科网络PHP商城系统 0
查看详情 启科网络PHP商城系统
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.总结

简单工厂模式, 总结起来就是一个工厂类,一个产品接口(其实也可以是一个抽象类,甚至一个普通的父类)和一群实现了产品接口的具体产品,而这个工厂类,根据传入的参数去创造一个具体的实现类,并向上转型为接口作为结果返回。

以上就是以Java代码为例讲解设计模式中的简单工厂模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关标签:
java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号