手机
当前位置:查字典教程网 >编程开发 >Java >以Java代码为例讲解设计模式中的简单工厂模式
以Java代码为例讲解设计模式中的简单工厂模式
摘要:1.简单工厂模式简介简单工厂模式(SimpleFactory),又被称为"静态工厂方法模式"。它属于"创建模式"(创建对象的模式),并且是"...

1. 简单工厂模式简介

简单工厂模式(Simple Factory),又被称为"静态工厂方法模式"。它属于"创建模式"(创建对象的模式),并且是"工厂方法"模式的一种特殊实现。

通常,我们利用简单工厂模式来进行类的创建。例如,获取线程池对象,就是通过简单工厂模式来实现的。它的结构图如下所示:

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

工厂:工厂是简单工厂模式的核心,提供了对外接口。客户端或其它程序要获取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() {} }

模型的类图

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

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.总结

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

【以Java代码为例讲解设计模式中的简单工厂模式】相关文章:

Java泛型的简单实例

java设计模式之建造者模式学习

java大数乘法的简单实现 浮点数乘法运算

java类中使用Jfreechart的简单实例

java中原码、反码与补码的问题分析

Java中去除字符串中所有空格的几种方法

代理角色java设计模式之静态代理详细介绍

JAVA实现单例模式的四种方法和一些特点

JAVA中JNI的简单使用分享

java循环练习的简单代码实例

精品推荐
分类导航