详细讲解工厂方法
为了更好的说明工厂方法,我们先不给出刻板的语言,我们根据实际的例子来看
假如我们要构建一个计算器,定义加法、乘法、除法等的各种操作,考虑到封装的思想,我们可能会构造如同加法类,乘法类,除法类,减法类等的一系列类如下:
- Class OperationAdd
- Class OperationMinus
- Class OperationMul
- Class OperationDiv
当我们想要增加新的功能的时候的时候我们就增加相应的类的时候即可,但是这样带来一个问题,当我们想要使用特定的类中的方法时,如果不是静态类的话我们都需要先实例化一个对象,比如我们要做乘除法等之类的连续操作,那么我们接下来的行为可能是这样的:
Class mul = new OperationMul()
Class div = new OperationDiv()
...
们可能需要最很多重复的操作,我们的代码可能会变得很臃肿。实际上这时我们要考虑的是如何去实例化对象的问题,也就是到底要实例化谁,将来会不会增加实例化的对象,比如我们还想增加新的功能应该怎么办呢?简单工厂方法正好为我们提供了这样的解决方法:
public class OperationFactory
{
public static Operation createOperate(String operate){
Operation oper = null;
switch(opertate){
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
在这里Operation是一个计算类,但是我们通过Switch case在实例化的时候实现了不同的子类,可以认为operation在这里实际上是一种声明,我们的Operation[a-z]都是operation的子类,这里运用了多态的性质。
eg: 多态的解释
Animal obj = new Horse();
这里我们假设Horse继承了Animal这个类,所以此处的Animal只是一种声明,在运行时这个对象的实际情况是由我们后面new的对象horse决定,参数化多态指的是一个类型的名字可以代表多个类型。
看到了吗?我们通过这样的设计方式,只需要输入运算的符号,工厂就能实例化出不同的对象,通过多态返回父类的方法同样实现了我们想要的结果。
接下来对于这样的方法思考以下两个问题:
1.如果我们想改变加法的行为,该怎么办呢?
答:只需要更改OperationAdd类即可
2.如果我们想要添加运算方式该怎么办呢,比如加上开方的运算
答:添加相应的运算子类,并在switch case的表项中添加相应的分支
总结:
当用户不知道要创建哪个具体类的实例,或者不想在用户代码中指明要创建的实例时我们通常使用工厂方法。
**工厂方法的实质是:**让子类来决定实例化哪一个类,从而使一个类的实例化延迟到子类。
看到这里相信大家对这个简单的工厂方法一定有一定的理解了,大家如果感兴趣的话可以看下**《大话设计模式》**中的抽象工厂方法,相信你会了解到工厂方法的设计精妙之处和相应的弊端。
这篇博客到这里就结束了,感谢你的阅读!