简单工厂模式 | 我把他看成一个选择器
- 前言
- 简单工厂模式的解释
- 面试官叫我先写一个简易的计算器
- 简单工厂模式经典面试题
- 参考资料
- 关于本系列的解释
一、前言
两篇文章写下去,有点没有动力了…疯狂暗示,还不快点赞。我打算从设计模式中的创建型模式开始写,会梳理一下全部的创建型模式,然后就是各种模式的作用与区别,敬请期待吧。嘿嘿嘿~~~进入主题
二、简单工厂模式的解释
简单工厂模式:考虑用一个单独的类来做这个创造实例的过程,这就是工厂。举个例子哈,我们要创建一个图形,他可能是继承图形类的三角形、矩形、圆形,我们单独把他抽离出来,写一个创建实例的选择,输入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种设计原则一系列课程,其目的就是一个简单的记录学习的过程。不知道能帮助到多少人,也不知道技术是否会有一定的深度。