(三)简单工厂模式详解 (五)

2014-11-24 10:41:11 · 作者: · 浏览: 1
ilter


dispatcherFilter
/servlet/*
上述我在filter中稍微加入了一些注释,由于本章的重点是简单工厂模式,所以我们这里突出我们本章的主角,使用简单工厂来创造servlet去处理客户的请求,当然如果你是一个JAVA造诣比较深的程序猿,或许会对这种方式不屑一顾,不过我们不能偏离主题,我们的目的不是模拟一个struts2,而是介绍简单工厂。

下面给出我们的主角,我们的servlet工厂。


[java]
package com.web.factory;

import javax.servlet.Servlet;

import com.web.exception.ServletException;
import com.web.servlet.LoginServlet;
import com.web.servlet.LoginoutServlet;
import com.web.servlet.RegisterServlet;

public class ServletFactory {

private ServletFactory(){}
//一个servlet工厂,专门用来生产各个servlet,而我们生产的依据就是传入的servletName,
//这个serlvetName由我们在filter截获,传给servlet工厂。
public static Servlet createServlet(String servletName){
if (servletName.equals("login")) {
return new LoginServlet();
}else if (servletName.equals("register")) {
return new RegisterServlet();
}else if (servletName.equals("loginout")) {
return new LoginoutServlet();
}else {
throw new ServletException("unknown servlet");
}
}
}

package com.web.factory;

import javax.servlet.Servlet;

import com.web.exception.ServletException;
import com.web.servlet.LoginServlet;
import com.web.servlet.LoginoutServlet;
import com.web.servlet.RegisterServlet;

public class ServletFactory {

private ServletFactory(){}
//一个servlet工厂,专门用来生产各个servlet,而我们生产的依据就是传入的servletName,
//这个serlvetName由我们在filter截获,传给servlet工厂。
public static Servlet createServlet(String servletName){
if (servletName.equals("login")) {
return new LoginServlet();
}else if (servletName.equals("register")) {
return new RegisterServlet();
}else if (servletName.equals("loginout")) {
return new LoginoutServlet();
}else {
throw new ServletException("unknown servlet");
}
}
}
看到这个,你是不是想说,I go your sister。。。

在看到它之前,你或许在猜想一定是一个利用了多态,继承,封装,反射等等JAVA高级特性写出来的一个非常牛X的工厂类。

但是你真的没看错,这便是我们的主角了,它很简陋,只是简单的根据你传入的servlet名称,返回一个对应的servlet实例,这就是简单工厂!真简单,我去。。。

有关对这分部请求分派更好的优化和架构,LZ会想办法穿插在以后的模式当中,顺便也将设计模式介绍给各位。

不过这个简单工厂最起码帮我们解决了恶心的xml配置,现在我们可以请求/contextPath/servlet/login来访问LoginServlet,而不再需要添加web.xml的配置,虽说这么做,我们对修改是开放的,因为每增加一个servlet,我们都需要修改工厂类,去添加一个if判断,但是LZ个人还是觉得我宁可写if,也不想去copy那个当初让我痛不欲生的xml标签,虽说我刚才还说让你忘掉elseif,我说过吗?好吧。。我说过,但是这只是我们暂时的做法,后面会想办法是用其它的方式消除掉这些。

简单工厂是设计模式当中相对比较简单的模式,它甚至都没资格进入GOF的二十三种设计模式,所以可见它多么卑微了,但就是这么卑微的一个设计模式,也能真正的帮我们解决实际当中的问题,虽说这种解决一般只能针对规模较小的项目。

写到这里,简单工厂模式当中出现的角色,已经很清晰了。我们上述简单工厂当中设计到的类就是Servlet接口,ServletFactory以及各种具体的LoginServlet,RegisterServlet等等。

总结起来就是一个工厂类,一个接口(其实也可以是一个抽象类,甚至一个普通的父类,但通常我们觉得接口是最稳定的),和一群接口的实现类,而这个工厂,根据传入的参数去创造一个具体的实现类,并向上转型为接口作为结果返回。

我们在这里将上述穿插的简单工厂模式抽离出来,注释中有LZ个人的见解,帮助各位理解。类图这里就不再贴了,因为满世界都是。。。

[java]
//相当于简单工厂模式中的产品接口
interface Servlet{}
//相当于简单工厂模式中的抽象父类产品。
//注意,简单工厂在网络上的资料大部分为了简单容易理解都是只规划了一个产品接口,但这不代表就只能有一个,设计模式的使用要灵活多变。
class HttpServlet implements Servlet{}
//具体的产品
class LoginServlet extends HttpServlet{}
class RegisterServlet extends HttpServlet{}
class LoginoutServlet extends HttpServlet{}
//产品工厂
public class ServletF