简单工厂模式就是解决不同场景下实例化对象的问题。
问题场景:做一个简单的计算器功能,实现加减乘除的功能,要实现这个功能很简单,但是却又要使用到面向对象的方法,降低程序的耦合度,符合开闭原则,就没有想象中那么简单,demo如下:
- 首先建立一个抽象的父类 Calculate,这个抽象的父类有一个计算的方法,这个方法是需要两个参数,而具体的子类的实现是由子类去做的,这样耦合度就降低了,也符合了开闭原则,想要增加计算方法的话,直接继承Calculate类,然后实现doCalulate方法就行了。
package domian;
public abstract class Calculate {
public abstract double doCalculate(double num1,double num2);
}
package domian;
public class Add extends Calculate {
@Override
public double doCalculate(double num1, double num2) {
return num1 + num2;
}
}
package domian;
public class Minus extends Calculate {
@Override
public double doCalculate(double num1, double num2) {
return num1 - num2;
}
}
package domian;
public class Ride extends Calculate {
@Override
public double doCalculate(double num1, double num2) {
return num1 * num2;
}
}
package domian;
public class Divide extends Calculate {
@Override
public double doCalculate(double num1, double num2) {
double result = 0;
try {
result = num1 / num2;
}catch(Exception e) {
e.printStackTrace();
return 0;
}
return num1 / num2;
}
}
- 降低了代码的耦合度之后呢,要考虑的问题是怎么将计算类来进行实例化,因为不知道具体要实例化子类中的哪个,那么就需要一个简单的对象工厂来产生实例化对象。
package domian;
public class CalculateFactory {
public static Calculate getCalculate(String operate) {
Calculate calculate = null;
switch (operate) {
case "+":
calculate = new Add();
break;
case "-":
calculate = new Minus();
break;
case "*":
calculate = new Ride();
break;
case "/":
calculate = new Divide();
break;
default:
break;
}
return calculate;
}
}
这样我么就只需要调用工厂方法并传入想要实例化的类就可以调用了,想要增加方法的话,只需要改动工厂就行了。
package domian;
public class Test {
public static void main(String[] args) {
Calculate calculate = CalculateFactory.getCalculate("*");
double re = calculate.doCalculate(1, 2);
System.out.println(re);
}
}