面试题答案
一键面试代码结构角度
- 抽象产品类:定义了所有具体产品的公共接口。例如:
abstract class Product {
public abstract void operation();
}
- 具体产品类:继承自抽象产品类,实现其抽象方法。不同的具体产品类提供不同的实现,体现多态性。例如:
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");
}
}
- 抽象工厂类:定义创建产品的抽象方法。
abstract class AbstractFactory {
public abstract Product createProduct();
}
- 具体工厂类:继承自抽象工厂类,实现创建具体产品的方法。每个具体工厂创建一种具体产品,通过返回不同的具体产品对象体现多态性。例如:
class ConcreteFactoryA extends AbstractFactory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
class ConcreteFactoryB extends AbstractFactory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
运行机制角度
- 在运行时,根据所使用的具体工厂类,会创建不同的具体产品对象。例如:
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"
这里,productA
和 productB
虽然都是 Product
类型,但实际运行时调用的 operation
方法是各自具体产品类的实现,体现了多态性。
对可维护性的帮助
- 易于修改:如果需要修改某个具体产品的行为,只需修改对应的具体产品类,不会影响其他产品类和工厂类。例如修改
ConcreteProductA
的operation
方法,不会对ConcreteProductB
及相关工厂造成影响。 - 降低耦合:抽象类和接口使得不同模块之间的依赖关系更加松散。例如,客户端代码依赖抽象工厂和抽象产品,而不是具体类,这样如果具体产品或工厂发生变化,客户端代码无需大幅改动。
对扩展性的帮助
- 新增产品容易:要新增一种产品,只需创建新的具体产品类继承抽象产品类,以及新的具体工厂类继承抽象工厂类,并实现创建该产品的方法。例如新增
ConcreteProductC
,只需要创建对应的ConcreteFactoryC
,对已有代码影响较小。 - 支持多种产品族:如果系统需要支持多种不同类型但相关的产品族,通过扩展抽象工厂类和具体工厂类,可以方便地实现。每个具体工厂负责创建同一族的产品,利用多态性可以灵活切换不同产品族的创建。