首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过计算器了解简单工厂模式

通过计算器了解简单工厂模式

作者头像
程序员小强
发布2019-06-02 14:54:45
8360
发布2019-06-02 14:54:45
举报

简单工厂模式

简单工厂模式(Simple Factory Model),又叫做静态工厂方法模式(Static Factory Method Model),属于创建型模式(也就是用于创建实例对象)。

简单工厂模式包括了以下三个部分:

  • 工厂(核心部分用于创建各种实例产品对象)
  • 抽象产品(所有具体产品的父类)
  • 具体产品

PS:因为该模式不符合开闭原则所以不属于23种GoF设计模式之一。

举个小例子

example:实现一个计算器可以对两个数字进行加减乘除运算! 细细一想很快就可以大致构造出自己的代码来: 这就是计算器 1.0 版本

/**
 * @author WQ
 */
public class Operation {
    /**
     * 进行计算器逻辑计算的方法
     */
    public static double result(double num1,double num2,String operate) {
        switch (operate) {
            case "+":
                return num1 + num2;
            case "-":
                return num1 - num2;
            case "*":
                return num1 * num2;
            case "/":
                return num1 / num2;
                default:
                    System.out.println("输入数字或运算符号有误!");
                    break;
        }
        return 0.00000000;//仅仅是自定义的表示错误的标识
    }
    /**
     * 测试
     */
    public static void main(String[] args) {
        double num1 = 0, num2 = 0, result = 0;
        String operate = null;
        //数据接收
        Scanner input = new Scanner(System.in);
        System.out.println("请数入第一个数字:");
        num1 = input.nextDouble();
        System.out.println("请输入进行运算的算法符号(+,-,*,/):");
        operate = input.next();
        System.out.println("请数入第二个数字:");
        num2 = input.nextDouble();
        //数据计算
        result = result(num1,num2,operate);
        System.out.println("数据计算结果为:" + result);
    }
}

但是呢,这个代码看起来太挤了,而且和面向对象似乎有点不搭边啊!对于面向对象的三大特性封装,继承,多态好像都没有使用到,而且我们也没有使用到简单工厂模式啊! 于是,我们需要对这段代码进行装饰!

装饰一下

我们首先明确一下对于简单工厂模式来说的三个部分属性:

  • 工厂 SimpleFactory
  • 抽象产品 Operation
  • 具体产品 Add, Subtract, Multiply, Divide

计算器 1.0 版本代码挤在了一起看起来太过于冗杂也不易于扩展,复用,所以我们有必要将其升级为 计算器 2.0 版本

首先我们可以大致规划一下基本的结构:

UML图 接着我们就开始搭建我们的工厂让它开始生产产品! 计算器的搭建: PS:这里的抽象父类可以是抽象类也可以是一个接口!此例子用抽象类实现!

/**
 *  @author WQ
 *  计算器抽象父类
 */
public abstract class Operation {
    private double num1 = 0;
    private double num2 = 0;
    public abstract double result();
/*对于num1,num2成员变量的getter与setter方法省略!*/
}
/**
 *  @author WQ
 *  加法运算部分
 */
public class Add extends Operation{
    @Override
    public double result() {
        return getNum1() + getNum2();
    }
}
/**
 *  @author WQ
 *  减法运算部分
 */
public class Substract extends Operation{
    @Override
    public double result() {
        return getNum1() - getNum2();
    }
}
/**
 * @author WQ
 * 乘法部分
 */
public class Multiply extends Operation {
    @Override
    public double result() {
        return getNum1() * getNum2();
    }
}
/**
 * @author WQ
 * 除法运算部分
 */
public class Divide extends Operation{
    @Override
    public double result() {
        if (getNum2() == 0) {
            try {
                throw new Exception("除数不可以是0!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return getNum1() / getNum2();
    }
}

实现了计算器我们就需要搭建工厂了,计算器部分的实现我们用到了封装和继承,而工厂我们就需要使用到多态啦!

/**
 * @author WQ
 * 简单工厂模式 依据不同的需求创建不同的对象
 */
public class SimpleFactory {
    public static Operation create(String operate) {
        Operation operation = null;
        switch (operate) {
            case "+":
                operation = new Add();
                break;
            case "-":
                operation = new Substract();
                break;
            case "*":
                operation = new Multiply();
                break;
            case "/":
                operation = new Divide();
                break;
            default:
                try {
                    throw new Exception("输入的运算符号不存在!");
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }
        return operation;
    }
}
测试

给出测试的代码:

     /**
     * 对简单工厂模式的测试代码
     */
    private static void testSimpleFactory() {
        com.ww.calculator2.Operation operation = null;
        operation = SimpleFactory.create("-");
        operation.setNum1(2);
        operation.setNum2(0);
        System.out.println("运算结果:" + operation.result());
    }

给出一个测试结果图

测试结果 计算器 2.0 版本相对于计算器 1.0 版本是不是更加的清楚明了呢?是不是也看着更加高大上呢? 这就是简单工厂模式的介绍啦!

End

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MoziInnovations 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单工厂模式
    • 举个小例子
      • 装饰一下
        • 测试
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档