工厂方法是一个使用很广泛的设计模式,接下来我使用对比的方式来说明工厂方法的优点与不足,与之前发表的文章简单工厂对比。
大家可以看代码实现的不同。
1.测试类
/**
* 需求:使用面向对象的思想完成一个简易计算器
* 可以实现+、-、*、/运算
*/
public class TestCount {
public static void main(String[] args) {
try {
// Factory openFactory = new AddFactory(); //加法运算
Factory openFactory = new SubFactory(); //减法运算
Count count = openFactory.createCount(); //隐藏具体运算类的创建细节
double num1 = 1;
double num2 = 2;
System.out.println("运算结果:" + count.count(num1, num2));
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
2.定义一个运算类,有不同的实现。
public class Count {
public double count(double num1, double num2) {
return 0;
}
}
public class AddCount extends Count {
public double count(double num1, double num2) {
return num1 + num2;
}
}
public class SubCount extends Count {
public double count(double num1, double num2) {
return num1 - num2;
}
}
public class MutilCount extends Count {
public double count(double num1, double num2) {
return num1 * num2;
}
}
public class DivCount extends Count {
public double count(double num1, double num2) {
if (num2 == 0) {
throw new RuntimeException("被除数不能为0");
}
return num1 / num2;
}
}
3.定义一个工厂接口,里面有一个工厂方法,用于创建不同的产品实现。
public interface Factory {
public Count createCount();
}
public class AddFactory implements Factory {
public Count createCount() {
return new AddCount();
}
}
public class SubFactory implements Factory {
public Count createCount() {
return new SubCount();
}
}
public class MutilFactory implements Factory {
public Count createCount() {
return new MutilCount();
}
}
public class DivFactory implements Factory {
public Count createCount() {
return new DivCount();
}
}
总结:1.封装了产品的创建过程,在简单工厂的基础上进一步进行抽象,对每一类具体的产品对象创建一个相对应的工厂,改善了简单工厂的缺点,遵循了OCP原则。2.把判断的逻辑放到了页面端,简单工厂把判断的逻辑放到了工厂里面来做,不符合OCP原则,当需求改变的时候,需要修改工厂的类,工厂方法可以使用反射来解决判断的逻辑,从而选择不同的运算类实现。整体而言,工厂方法是对简单工厂的完善。