导语
什么是多态?我们先来看看百度百科给出的回答——在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。而我理解的多态其实究其根本就只有一句话就是——子类的实现指向父类的引用。下面我们通过实例来学习了解一下面向对象中的多态。
简单工厂
什么是简单工厂?
我们将实例化子类的过程交由一个单独的类来去创造实例,这个单独的类就是我们说的工厂。所有的实例化字类的过程都交由工厂去做,而不是在客户端去做。
构造运算器类
现在我们有一个运算器类,他有两个子类分别是加法类和减法类,以下使他们现在的类图:
以下是具体的代码实现:
运算类:
public class Operation{ private double numberA = 0; private double numberB = 0; public double getNumberA() { return numberA; } public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberB() { return numberB; } public void setNumberB(double numberB) { this.numberB = numberB; } // 获取结构的抽象方法 public abstract double GetResult(); }
加法类:
public class OperationAdd extends Operation{ @Override public double GetResult() { double result = 0; result = super.getNumberA() + super.getNumberB(); return result; } }
减法类:
public class OperationSub extends Operation{ @Override public double GetResult() { double result = 0; result = getNumberA() - getNumberB(); return result; } }
构造简单工厂类
我们在此基础之上加上简单工厂,由简单工厂来创建子类,类图变化为下图:
简单工厂代码:
public class OperationFactory { public static Operation createOperate(String operate) { Operation opera = null; switch (operate) { case "+": opera = new OperationAdd(); break; case "-": opera = new OperationSub(); break; } return opera; } }
客户端实现
public class Client { public static void main(String[] args) { Operation opera; opera = OperationFactory.createOperate("+"); opera.setNumberA(1); opera.setNumberB(2); double result = opera.GetResult(); System.out.println(result); } }
分析
为什么要在讲解多态的时候引入简单工厂呢?首先是简单工厂的实现很好的体现了面向对象的多态特征。我们可以看到上面的简单工厂代码实现部分的第3行和第6行、第9行。这里就很好的体现了在导语中提到的子类的实现指向了父类的引用
而在这里使用的简单工厂也体现了多态的一个好处——可扩展性。如果此时,我想新增一个乘法类,那么我只需要新增一个单独的乘法类,并且在switch case中增减一个“x”符号的判断就能实现乘法的扩展,但是这种解决方案还是违反了开闭原则,当然也有其他的解决办法来处理这个问题,可以使用工厂方法来解决,在这里就不过多赘述,主要是要讨论面向对象中多态的特性。