工厂方法模式 (Factory Method Pattern)是一种创建型设计模式,旨在定义一个创建对象的接口,但让子类决定实例化哪一个类。
通过将对象的创建逻辑分散到各个具体的工厂类中,而不是集中在一个工厂类中,从而实现更灵活和易于扩展的系统结构
核心思想
- 将创建对象的责任委托给子类,而不是在父类中直接实例化对象。
- 父类定义一个创建对象的接口,而子类负责实现这个接口,从而决定创建哪种类型的对象。
核心概念
- 抽象产品类(Product) :定义创建对象的公共接口,用于定义产品共有的属性和方法。
- 具体产品类(Concrete Product) :实现抽象产品类中的接口,代表不同类型的产品。
- 抽象工厂类(Factory) :定义创建对象的工厂接口,通常包含一个抽象方法用于创建产品。
- 具体工厂类(Concrete Factory) :实现抽象工厂类中的接口,定义创建具体产品的逻辑。
示例
假设我们要创建一个汽车生产系统,需要生产不同类型的汽车,汽车品牌有 BYD、XIAOMI 和 AITO。
抽象产品 : Car
接口定义了汽车的公共方法 getBrand()
,用于获取汽车品牌。
interface Car {
String getBrand();
}
具体产品 : BYDCar
、XIAMICar
和 AITOCar
类分别实现了 Car
接口,并定义了返回对应品牌的方法。
class BYDCar implements Car {
@Override
public String getBrand() {
return "BYD";
}
}
class XIAMICar implements Car {
@Override
public String getBrand() {
return "XIAOMI";
}
}
class AITOCar implements Car {
@Override
public String getBrand() {
return "AITO";
}
}
抽象工厂: CarFactory
接口定义了一个抽象方法 createCar()
,用于创建汽车。
interface CarFactory {
Car createCar();
}
具体工厂: BYDFactory
、XIAMIFactory
和 AITOFactory
类分别实现了 CarFactory
接口,并定义了创建对应品牌汽车的逻辑。
class BYDFactory implements CarFactory {
@Override
public Car createCar() {
return new BYDCar();
}
}
class XIAOMIFactory implements CarFactory {
@Override
public Car createCar() {
return new XIAOMICar();
}
}
class AITOFactory implements CarFactory {
@Override
public Car createCar() {
return new AITOCar();
}
}
选择对应的工厂来生成对应的汽车
// 使用工厂方法模式创建汽车
public class Main {
public static void main(String[] args) {
// 手动选择具体工厂
CarFactory factory1 = new XIAOMIFactory(); // 选择创建小米汽车工厂
CarFactory factory2 = new AITOFactory();//选择选择问界汽车工程
Car car1 = factory1.createCar();
System.out.println("品牌: " + car.getBrand());
Car car2 = factory2.createCar();
System.out.println("品牌: " + car.getBrand());
}
}
优缺点
优点:
- 开放封闭原则: 可以通过添加新的具体工厂类来扩展系统,而无需修改现有代码。
- 代码可读性: 代码结构清晰,易于理解和维护。
- 灵活性: 因为实例化过程推迟到子类中,可以根据需要选择不同的具体工厂来创建不同的产品。
缺点:
- 增加代码复杂度: 需要定义多个工厂类和产品类,可能会增加代码复杂度。
工厂方法模式与开闭原则的关系
简单工厂:简单工厂模式-CSDN博客
开闭原则的核心思想是“对扩展开放,对修改关闭”,即在不修改现有代码的情况下增加新功能。
简单工厂模式虽然可以实现创建对象的统一管理,但在引入新产品时需要修改工厂类的代码,这违背了开闭原则。而工厂方法模式则通过定义一个创建对象的接口,并让子类决定实例化哪一个类,从而实现了在不修改原有代码的情况下引入新产品的目标。具体来说,当需要增加一个新产品时,只需要增加一个具体的产品类和与之对应的具体工厂类,而不需要修改现有的代码。
因此,工厂方法模式是对简单工厂模式的进一步抽象化和改进,更加符合开闭原则。