博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单工厂模式
阅读量:6167 次
发布时间:2019-06-21

本文共 3088 字,大约阅读时间需要 10 分钟。

定义

简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

类图

775964-20171023161217598-1184733560.png

从上图可以看出总共有三种类,一个产品工厂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
*
*
*
route
*
/route/*
*
*/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(); } }}

如果我们以后需要增加一项业务,比如获取用户列表那么我们就新增一个实现了IAction接口的UserAction,当然简单工厂下我们必须改变ActionFactory的逻辑判断代码。但是简单工厂也为我们带来了好处,我们不用再书写web.xml配置,请求可以被自动路由的对应的action。

总结

设计原则:遵循单一职责、违背开闭原则

常用场景:需要在一堆产品中选择其中一个产品
使用概率:99.99999%
复杂度:低
变化点:产品的种类
选择关键点:一种产品是否可根据某个参数决定它的种类
逆鳞:工厂类不能正常工作
相关设计模式
工厂方法模式:工厂方法模式是简单工厂模式的进一步抽象化,在这两者之间做选择,主要看将工厂进一步抽象化是否有必要,通常情况下,如果工厂的作用仅仅是用来制造产品,则没必要使用工厂方法模式。

转载于:https://www.cnblogs.com/learningchencheng/p/7717340.html

你可能感兴趣的文章
VMware下PM魔术分区使用教程
查看>>
nslookup错误
查看>>
我的友情链接
查看>>
Supported plattforms
查看>>
做自己喜欢的事情
查看>>
CRM安装(二)
查看>>
关于C# -WINFORM-DataGridView的更新、删除
查看>>
【Android进阶学习】监听EditText的变化
查看>>
gulp 插件之 del
查看>>
vim configure
查看>>
Nginx一点总结
查看>>
Linux_MySQL(mariadb)基础(1)V1.0
查看>>
HDU1280 前m大的数
查看>>
系统自动化安装kickstart文件解析
查看>>
澄清大数据存储——系统集成商篇
查看>>
学习git知识_1
查看>>
RHEL5.5下vsftp服务器搭建
查看>>
Netscreen与Cisco跑OSPF
查看>>
Python辅助安全测试常用代码示例
查看>>
软件质量之web项目的CUT
查看>>