什么是多态?
指为不同数据类型的实体提供统一的接口。指的是两个或者多个属于不同类的对象对于同一消息或者方法
调用所做出不同的响应的能力。简单来说是:父类的引用指向子类的实现
多态主要用途
提高系统的可维护性,可扩展性,如果我们想扩展同一个父类的新的一类方法,我们可以通过创建一个新的子类来实现不同的方法。
多态示例
什么是简单工厂?
使用一个工厂对象(一个单独的类来去创造实例)用来生产同一等级结构中的任意产品。所有的实例化字类的过程都交由工厂去做,而不是在客户端去做。
构造运算器类写法
类图
代码
public class Operation
{
private double _numberA = 0;
private double _numberB = 0;
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}
public double NumberB
{
get { return _numberB; }
set { _numberB = value; }
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
class OperationAdd:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
public class OperationSub:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
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 oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
Console.WriteLine(result);
}
}
分析
由上图可知:Operation类是父类,父类引用指向子类(OperationAdd)的实现,对于同一个方法每个子类都有不同的实现。
简单工厂体现出多态的一个好处——可扩展性。如果此时,要增一个乘法类,那么我只需要新增一个单独的乘法类,并且在switch case中增减一个“x”符号的判断就能实现乘法的扩展,但是这种解决方案还是违反了开闭原则,这里对开闭原则不做说明。
总结:
当谈论多态时,我们通常在面向对象编程(OOP)的背景下讨论它。多态是OOP的一个重要概念,它允许不同的对象对于相同的方法调用做出不同的响应。简单来说,多态性允许你使用一个父类引用来引用子类的对象,并且在运行时根据实际的对象类型来调用相应的方法。
在简单工厂模式中,多态性可以被广泛应用,特别是在创建对象实例的过程中。简单工厂模式是一种创建型设计模式,它封装了对象的实例化过程,使客户端代码与具体类的实例化解耦。多态性使得你可以使用父类引用来指向各种具体子类的实例,而不必直接引用每个具体子类。
让我更具体地解释一下多态在简单工厂中的应用:
假设你有一个简单工厂,用于创建不同类型的图形对象,比如圆形和矩形。首先,你会有一个抽象的“Shape”类作为父类,其中包含一个名为“draw”的方法。然后,你有“Circle”和“Rectangle”两个具体子类,它们都继承自“Shape”并实现了“draw”方法。
使用多态,你可以在客户端代码中这样使用简单工厂:
public class Client {
public static void main(String[] args) {
ShapeFactory factory = new ShapeFactory();
Shape circle = factory.createShape("Circle");
Shape rectangle = factory.createShape("Rectangle");
circle.draw(); // 调用Circle的draw方法
rectangle.draw(); // 调用Rectangle的draw方法
}
}
在这里,你只是通过父类引用“Shape”来创建和调用不同的子类对象,实现了多态性。客户端代码并不直接涉及具体类的实例化,而是通过简单工厂创建适当的对象。
多态性使得你的代码更具灵活性和可扩展性,因为你可以轻松地添加新的子类,而不必更改客户端代码。同时,它也促进了代码的松耦合,提高了代码的可维护性和可测试性。
当谈到多态和简单工厂模式时,还有一些其他要补充的重要点:
-
扩展性: 多态和简单工厂模式都有助于增强代码的扩展性。你可以轻松地添加新的具体子类,只需扩展抽象父类和适当调整工厂类,而不必修改客户端代码。
-
灵活性: 多态性使得你可以在运行时决定使用哪个具体子类的实例。这意味着你可以根据需求动态切换不同的实现,从而实现更大的灵活性。
-
封装: 简单工厂模式封装了对象的实例化过程,将创建对象的细节隐藏在工厂内部。这有助于减少客户端代码与具体类之间的直接耦合。
-
适用场景: 简单工厂模式适用于具有共同接口和不同实现的类族。它适用于需要在运行时选择一个类的情况,同时隐藏了实例化的细节。
-
抽象工厂模式: 如果需要创建多个相关的对象组,可以考虑使用抽象工厂模式。它提供了一种创建一系列相关或依赖对象的方法。
-
弹性架构: 多态和简单工厂模式都有助于构建弹性的、可维护的架构。它们支持开闭原则(Open-Closed Principle),即系统应该对扩展开放,对修改关闭。
-
继承和重写: 多态性涉及到子类对父类方法的重写(override),确保子类可以根据自身需求实现不同的行为。
-
代码可读性: 使用多态性和工厂模式可以使代码更加可读,因为它们使代码更具抽象性和可理解性。
总之,多态性和简单工厂模式是面向对象编程中的重要概念,可以帮助你构建更加灵活、可扩展和可维护的代码。通过正确应用它们,你可以更好地管理对象的创建和使用,从而提高代码质量和开发效率。