简单工厂模式(Simple Factory Model)是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂UML图:
以Struts2中result的设计为例(java):
package simpleFactoryModel;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//以struts2中配置文件result属性为例
// struts.xml---->如<result name="success" type="dispatcher">path</result>
public abstract class Result {
protected String path;
// 静态方法,根据type类型生成具体子类reslut对象--->简单工厂方式
public static Result getInstance(String path, String type) {
if("dispatcher".equals(type)){
return new DispatcherResult(path);
}else if("redirect".equals(type)){
return new RedirectResult(path);
}else{
return null;
}
}
public Result(String path) {
this.path = path;
}
public abstract void execute(HttpServletRequest request,
HttpServletResponse response);
}
在这里仅以dispatcher和redirect为具体result实例:
package simpleFactoryModel;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DispatcherResult extends Result{
public DispatcherResult(String path) {
super(path);
}
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
//转发
try {
request.getRequestDispatcher(path).forward(request, response);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package simpleFactoryModel;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RedirectResult extends Result {
public RedirectResult(String path) {
super(path);
}
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
// 重定向操作
try {
response.sendRedirect(path);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
简单工厂模式的优缺点分析(借鉴一下,总结的很好):
优点:工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,这就直接导致一旦这个工厂出了问题,所有的客户端都会受到牵连;而且由于简单工厂模式的产品室基于一个共同的抽象类或者接口,这样一来,但产品的种类增加的时候,即有不同的产品接口或者抽象类的时候,工厂类就需要判断何时创建何种种类的产品,这就和创建何种种类产品的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护性。而且更重要的是,简单工厂模式违背了“开放封闭原则”,就是违背了“系统对扩展开放,对修改关闭”的原则,因为当我新增加一个产品的时候必须修改工厂类,相应的工厂类就需要重新编译一遍。