简单工厂模式 | 我把他看成一个选择器

简单工厂模式 | 我把他看成一个选择器

  1. 前言
  2. 简单工厂模式的解释
  3. 面试官叫我先写一个简易的计算器
  4. 简单工厂模式经典面试题
  5. 参考资料
  6. 关于本系列的解释

一、前言

两篇文章写下去,有点没有动力了…疯狂暗示,还不快点赞。我打算从设计模式中的创建型模式开始写,会梳理一下全部的创建型模式,然后就是各种模式的作用与区别,敬请期待吧。嘿嘿嘿~~~进入主题

二、简单工厂模式的解释

简单工厂模式:考虑用一个单独的类来做这个创造实例的过程,这就是工厂。举个例子哈,我们要创建一个图形,他可能是继承图形类的三角形、矩形、圆形,我们单独把他抽离出来,写一个创建实例的选择,输入1就是三角形,输入2就是矩形,输入3就是圆形。

package shape;

import java.util.Random;

public class RandomShapeGenerator {
    private Random random = new Random();

    public Shape next(){
        switch (random.nextInt(3)){
            case 1:
                return new Circle();
            case 2:
                return new Square();
            case 0:
                return new Triangle();
            default:
                return null;
        }
    }
}

啥?你说不够形象,那我出一道题哈。

二、面试官叫我先写一个简易的计算器

前两天,面了一家公司,公司啥也没问,进来就是用面向对象原则写一个计算器。我心想,有点套路啊,我需要把毕生所学的设计模式用上。

思路:我们使用简单工厂模式来实现一个简单的计算器,对于运算符有4种,加减乘除。我们可以定义一个关于运算符的基类,这个基类中,包含了两个数,一个可以返回结果的方法。然后分别的定义加减乘除的4个类,都是继承运算符的基类,然后根据不同的运算符,重写返回结果方法,对两个数进行不同的运算。
主函数中,因为我们在不同的继承类中,都是自定义的getResult方法,所以我们只需要调用operator.getResult方法就行。当然还不够,现在有了4个不同的运算符的类,我们就需要在主函数中,对我们应该生成的类进行判断。则就是需要一个SwitchOperator类,此类根据不同的运算符的符号,把主函数创建的operator类生成不同的继承类。

Operator.java 基类:两个变量一个计算结果方法

package simplefactory;

public class Operator {
    private double number1;
    private double number2;

    public double getNumber1() {
        return number1;
    }

    public void setNumber1(double number1) {
        this.number1 = number1;
    }

    public double getNumber2() {
        return number2;
    }

    public void setNumber2(double number2) {
        this.number2 = number2;
    }

    public double getResult(){
        double result = 0.0;
        return result;
    }
}

OperatorAdd.java 类:只需要重写计算结果方法

package simplefactory;

public class OperatorAdd extends Operator {
    @Override
    public double getResult() {
        return getNumber1() + getNumber2();
    }
}

OperatorReduce.java 类:只需要重写计算结果方法

package simplefactory;

public class OperatorReduce extends Operator {
    @Override
    public double getResult() {
        return getNumber1()-getNumber2();
    }
}

OperatorMultiply.java 类:只需要重写计算结果方法

package simplefactory;

public class OperatorMultiply extends Operator {
    @Override
    public double getResult() {
        return getNumber1() * getNumber2();
    }
}

OperatorDevide.java 类:只需要重写计算结果方法

package simplefactory;

public class OperatorDevide extends Operator {
    @Override
    public double getResult() {
        if (getNumber2() == 0){
            throw new RuntimeException("除数不能为零");
        }
        return getNumber1() / getNumber2();
    }
}

SwitchOperator.java 类:需要选择到底使用的是哪个Operator

package simplefactory;

public class SwitchOperator {
    public static Operator getOperator(String str){
        Operator operator = null;
        switch (str){
            case "+":
                operator = new OperatorAdd();
                break;
            case "-":
                operator = new OperatorReduce();
                break;
            case "*":
                operator = new OperatorMultiply();
                break;
            case "/":
                operator = new OperatorDevide();
                break;
            default:
                throw new RuntimeException("请输入正确的运算符");
        }
        return operator;
    }
}

主函数

package simplefactory;

public class TestSimpleFactory {
    public static void main(String[] args){
        Operator test = SwitchOperator.getOperator("+");
        test.setNumber1(1);
        test.setNumber2(0);
        System.out.println("result = " + test.getResult());
    }
}

上面的栗子有点懂了吧,我们写一个SwitchOperator类,把它当成工厂,根据不同的运算符,生成不同的结果。

简单工厂模式经典面试题

待定

五、参考资料

书籍1:《大话设计模式》 第1章 代码无错就是优?–简单工厂模式

六、关于本系列的解释

本系列想制作24种设计模式+7种设计原则一系列课程,其目的就是一个简单的记录学习的过程。不知道能帮助到多少人,也不知道技术是否会有一定的深度。

制作不易,您的点赞是我最大的动力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖丨学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值