MST

星途 面试题库

面试题:Java抽象类工厂模式下的多态性体现

在使用Java抽象类实现工厂模式时,多态性是如何体现的?请从代码结构和运行机制角度详细阐述,并且说明这种多态性对代码的可维护性和扩展性有什么帮助。
49.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代码结构角度

  1. 抽象产品类:定义了所有具体产品的公共接口。例如:
abstract class Product {
    public abstract void operation();
}
  1. 具体产品类:继承自抽象产品类,实现其抽象方法。不同的具体产品类提供不同的实现,体现多态性。例如:
class ConcreteProductA extends Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductA's operation");
    }
}

class ConcreteProductB extends Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductB's operation");
    }
}
  1. 抽象工厂类:定义创建产品的抽象方法。
abstract class AbstractFactory {
    public abstract Product createProduct();
}
  1. 具体工厂类:继承自抽象工厂类,实现创建具体产品的方法。每个具体工厂创建一种具体产品,通过返回不同的具体产品对象体现多态性。例如:
class ConcreteFactoryA extends AbstractFactory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

class ConcreteFactoryB extends AbstractFactory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

运行机制角度

  1. 在运行时,根据所使用的具体工厂类,会创建不同的具体产品对象。例如:
AbstractFactory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.operation(); // 输出 "ConcreteProductA's operation"

AbstractFactory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.operation(); // 输出 "ConcreteProductB's operation"

这里,productAproductB 虽然都是 Product 类型,但实际运行时调用的 operation 方法是各自具体产品类的实现,体现了多态性。

对可维护性的帮助

  1. 易于修改:如果需要修改某个具体产品的行为,只需修改对应的具体产品类,不会影响其他产品类和工厂类。例如修改 ConcreteProductAoperation 方法,不会对 ConcreteProductB 及相关工厂造成影响。
  2. 降低耦合:抽象类和接口使得不同模块之间的依赖关系更加松散。例如,客户端代码依赖抽象工厂和抽象产品,而不是具体类,这样如果具体产品或工厂发生变化,客户端代码无需大幅改动。

对扩展性的帮助

  1. 新增产品容易:要新增一种产品,只需创建新的具体产品类继承抽象产品类,以及新的具体工厂类继承抽象工厂类,并实现创建该产品的方法。例如新增 ConcreteProductC,只需要创建对应的 ConcreteFactoryC,对已有代码影响较小。
  2. 支持多种产品族:如果系统需要支持多种不同类型但相关的产品族,通过扩展抽象工厂类和具体工厂类,可以方便地实现。每个具体工厂负责创建同一族的产品,利用多态性可以灵活切换不同产品族的创建。