定义
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
类图
从上图可以看出总共有三种类,一个产品工厂ProductFactory;一个产品接口Product;一个具体产品,如ConcreteProduct2和ConcreteProduct1;工厂类负责产品生产逻辑,通过我们传入的参数确定最终得到的产品,用户不关系产品创造的细节;
java代码实现
产品接口
public interface Product { void method();}
产品实现
public class ConcreteProduct1 implements Product { @Override public void method() { System.out.println("产品1方法"); }}
需要增加产品就继续实现Product接口进行实现就行了
产品工厂
public class ProductFactory { public static Product getProduct(String productName) throws Exception { switch (productName) { case "product1": return new ConcreteProduct1(); case "product2": return new ConcreteProduct2(); default: throw new Exception("本工厂没有其他的产品"); } }}
以上便是类图转为java
代码的简单例子,为了更方便理解,下面我们给出实际中的例子去更好的阐述简单工厂。
实例
模拟action处理,为了更好的体现主题简单工厂模式
,我们不关心许多的其他细节。
IAction (产品接口)
public interface IAction { void execute();}
具体的action实现 (产品实现)
public class LoginActon implements IAction { @Override public void execute() { System.out.println("这里写登陆逻辑"); }}public class RegisterActon implements IAction { @Override public void execute() { System.out.println("这里写注册逻辑"); }}
创建action的工厂 (产品工厂)
public class ActionFactory { public static IAction createAction(String actionName) throws Exception { if (actionName.equalsIgnoreCase("login")) { return new LoginActon(); } else if (actionName.equalsIgnoreCase("register")) { return new RegisterActon(); } else { throw new Exception("没有其他action"); } }}
Servlet接口
/** * web.xml 配置: ** *route *RouteServlet ** */public class RouteServlet extends HttpServlet { private static final String PREFIX = "route/"; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String uri = req.getRequestURI(); Matcher matcher = Pattern.compile("(?<=" + PREFIX + ").*").matcher(uri); String actionStr = "register"; if (matcher.find()) { actionStr = matcher.group(); } try { IAction action = ActionFactory.createAction(actionStr); action.execute(); } catch (Exception e) { e.printStackTrace(); } }}route */route/* *
如果我们以后需要增加一项业务,比如获取用户列表那么我们就新增一个实现了IAction
接口的UserAction,当然简单工厂下我们必须改变ActionFactory
的逻辑判断代码。但是简单工厂也为我们带来了好处,我们不用再书写web.xml
配置,请求可以被自动路由的对应的action。
总结
设计原则:遵循单一职责、违背开闭原则
常用场景:需要在一堆产品中选择其中一个产品 使用概率:99.99999% 复杂度:低 变化点:产品的种类 选择关键点:一种产品是否可根据某个参数决定它的种类 逆鳞:工厂类不能正常工作 相关设计模式 工厂方法模式:工厂方法模式是简单工厂模式的进一步抽象化,在这两者之间做选择,主要看将工厂进一步抽象化是否有必要,通常情况下,如果工厂的作用仅仅是用来制造产品,则没必要使用工厂方法模式。