文档章节

简单工厂模式

allenguoguo
 allenguoguo
发布于 2015/11/17 17:57
字数 803
阅读 58
收藏 5

模式定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例,简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

模式结构

1.Factory:工厂角色

工厂角色负责实现创建所有实例的内部逻辑

2.Product:抽象产品角色

抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口

3.ConcreteProduct:具体产品角色

具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例

实例

背景:通过一个简单的计算器<加减乘除>来说明这个模式

1.创建一个工厂,这个类主要是通过传进去的运算符来生成对应的运算类

public class OperationFactory {
    public static Operation createOperation (String operate) {
        Operation operation = null;
        switch(operate) {
        case "+":
            operation = new OperationAdd();
            break;
        case "-":
            operation = new OperationSubtract();
            break;
        case "*":
            operation = new OperationMultiply();
            break;
        case "/":
            operation = new OperationDivide();
            break;
        }
        return operation;
    }
}

2.定义抽象出来的运算接口

public interface Operation {
    //获取两位数计算的结果
    public int getResult(int numberOne,int numberTwo);
}

3.每个运算类分别去实现Operation 接口

/**
 * 加法运算
 * @author shengfenglai
 */
public class OperationAdd implements Operation {
    @Override
    public int getResult(int numberOne, int numberTwo) {
        return numberOne + numberTwo;
    }
}
/**
 * 减法运算
 * @author shengfenglai
 */
public class OperationSubtract implements Operation {
    @Override
    public int getResult(int numberOne, int numberTwo) {
        return numberOne - numberTwo;
    }
}
/**
 * 乘法运算
 * @author shengfenglai
 */
public class OperationMultiply implements Operation {
    @Override
    public int getResult(int numberOne, int numberTwo) {
        return numberOne * numberTwo;
    }
}
/**
 * 除法运算
 * @author shengfenglai
 */
public class OperationDivide implements Operation {
    @Override
    public int getResult(int numberOne, int numberTwo) {
        int result = 0;
        if(numberTwo != 0) {
            result = numberOne / numberTwo;
        }else {
            throw new NotBeZeroException("除数不能为0");
        } 
        return result;
    }
}

4.自定义一个异常,用来除数为0的时候抛出

public class NotBeZeroException extends RuntimeException {
    /**
     * 
     */
    private static final long serialVersionUID = 9056463784173674087L;
    public NotBeZeroException(String msg) {
        super(msg);
    }
}

5.测试类

public class OperationTest {
    public static void main(String[] args) {
        //test for add 
        Operation addOperation = OperationFactory.createOperation("+");
        int addResult = addOperation.getResult(1,2);
        System.out.println("1 + 2 = " + addResult);
        //test for subtract
        Operation subtractOperation = OperationFactory.createOperation("-");
        int subtractResult = subtractOperation.getResult(9,5);
        System.out.println("9 - 5 = " + subtractResult);
        //test for  multiply
        Operation multiplyOperation = OperationFactory.createOperation("*");
        int multiplyResult = multiplyOperation.getResult(4,6);
        System.out.println("4 * 6 = " + multiplyResult);
        // test for divide
        Operation divideOperation = OperationFactory.createOperation("/");
        int divideResult = divideOperation.getResult(8,4);
        //int divideResult = divideOperation.getResult(8,0);
        System.out.println("8 / 4 = " + divideResult);
    }
}

模式优点

模式的核心是工厂类,该类中含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式实现了对责任的分割。



模式缺点

1.工厂类用静态方法作为工厂类,这样就没办法由子类继承,所以没办法形成继承的等级结构

2.将多个创建逻辑放在一个类中,当产品类有不同接口种类时,工厂类需要判断在什么时候创建某种产品,使得系统在将来进行功能扩展时较为困难。就是if else 会越来越多,不利于维护

3.只适用于工厂类负责创建的对象比较少时


© 著作权归作者所有

allenguoguo
粉丝 18
博文 35
码字总数 24966
作品 0
深圳
程序员
私信 提问
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
286
2
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
277
0

没有更多内容

加载失败,请刷新页面

加载更多

开发中常用的正则表达式

为了能够更好地理解如何在C#环境中使用正则表达式,这里整理了一些常用的正则表达式: 罗马数字: string p1 = "^m*(d?c{0,3}|c[dm])" + "(l?x{0,3}|x[lc])(v?i{0,3}|i[vx])$"; string t1 =......

木庄
9分钟前
3
0
【.NET程序打包】VS2019使用Installer Projects打包

C#—使用Installer Projects打包桌面应用程序 前言 打包桌面应用程序实在是一个不常使用的东西,偶尔使用起来经常会忘东忘西的耽误时间,因此,这篇文章多以图片记录过程,也是用于备忘。 下...

_Somuns
14分钟前
2
0
自定义注解,使用动态代理解决网站的字符集编码问题

第1章设置环境 安装操作系统,安装备份(镜像): JDK: 设置环境变量Eclipse:解压即可 Eclipse自身解压目录不包括中文 代码工作空间目录不包括中文Tomcat:解压不要包含中文目录M...

蓝来杯往
18分钟前
2
0
Solr中的字段类型field type

Solr含有多种字段类型,可用的字段类型基本都定义在了包org.apache.solr.schema中,列举如下: 类 说明 BinaryField 二进制数据 BoolField 布尔值,其中’t’/’T’/’1’都是true Collatio...

gantaos
32分钟前
3
0
《JAVA核心知识》学习笔记 (21. JAVA 算法)

21. JAVA 算法

Shingfi
39分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部