设计模式(1) -- 简单工厂模式
简单工厂模式 -- 其本质就是由工厂类根据外部因素去选择的创建一个实例。
简单工厂模式模型:接口IProduct + 工厂类Creator
接口和实现类:
public interface IProduct { public void printSomethingByType(); }
public class Product_A implements IProduct { public void printSomethingByType() { System.out.println("-----用户one执行----"); } }
public class Product_B implements IProduct {
public void printSomethingByType() {
System.out.println("-----用户two执行----");
}
}
工厂类:
public class Creator { public IProduct factory(String type) { if ("One".equals(type)) { return new Product_A(); } else if ("Two".equals(type)) { return new Product_B(); } else { System.out.println("没有要找的类型"); return null; } } }
--------
左潇龙大神在博客里面提到了简单工厂的的一些实际应用,我学习一下。(http://www.cnblogs.com/zuoxiaolong/p/pattern4.html)
在使用Strust2开发的时候,一般一个servlet只会处理一个具体的业务请求,随着业务量的增加,会导致在web.xml里面配置servlet的配置。
如果要实现将几个业务处理整合到一个servlet中去:
protected void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException {
//我们加入一个操作的参数,来让servlet做出不同的业务处理
String operation = req.getParameter("operation");
if(operation.equals("login")){
System.out.println("login");
}else if (operation.equals("register")) {
System.out.println("register");
}else if (operation.equals("loginout")) {
System.out.println("loginout");
}else {
throw new RuntimeException("invalid operation");
}
}
如果你的项目中出现了这种代码结构,请务必想办法去掉它,你完全可以尽量忘掉Java里还有elseif和swich
也可以将各个分支的业务逻辑拆分出来,成为一个相对的方法体。但是这样又违背了"单一原则"。因为我们的servlet应该只是处理业务逻辑,而不应该还要负责与业务逻辑不相关的处理方法定位这样的责任,这个责任应该交给请求方,原本在三个servlet分别处理登陆,注销和注册的时候,其实就是这样的,作为请求方,只要是请求 LoginServlet,就说明请求的人是要登陆,处理这个请求的servlet不需要再出现有关判断请求操作的代码。
拦截器会拦截requestName,然后构建一个工厂类通过requestName来返回对应的实例!
---------------
后续我会研究一下springmvc 路由控制的源码,看看是不是也有简单工厂模式的实现。