工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种将对象的实例化过程延迟到子类中去实现的方式。简单来说,它定义了一个创建对象的接口,但让子类决定要实例化哪一个类。这使得系统在不修改已有代码的情况下,能够引入新的产品类型,从而提高了系统的可扩展性和灵活性。
该模式的核心思想是将对象的创建与使用分离,客户端只需要知道所需产品对应的工厂,而无需关心具体的创建细节。这符合“开闭原则”,即对扩展开放,对修改关闭。
工厂方法模式主要包含以下角色:
它们之间的关系可以概括为:具体工厂创建具体产品,但返回给客户端的是抽象产品类型。
假设我们需要一个系统来生产不同的交通工具,如汽车和自行车。使用工厂方法模式可以实现如下:
`java
// 1. 抽象产品
interface Vehicle {
void drive();
}
// 2. 具体产品
class Car implements Vehicle {
@Override
public void drive() {
System.out.println("Driving a car...");
}
}
class Bicycle implements Vehicle {
@Override
public void drive() {
System.out.println("Riding a bicycle...");
}
}
// 3. 抽象工厂
abstract class VehicleFactory {
// 工厂方法
public abstract Vehicle createVehicle();
public void deliverVehicle() {
Vehicle vehicle = createVehicle();
System.out.println("Preparing delivery...");
vehicle.drive();
}
}
// 4. 具体工厂
class CarFactory extends VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Car();
}
}
class BicycleFactory extends VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Bicycle();
}
}
// 5. 客户端代码
public class Client {
public static void main(String[] args) {
VehicleFactory carFactory = new CarFactory();
carFactory.deliverVehicle();
VehicleFactory bikeFactory = new BicycleFactory();
bikeFactory.deliverVehicle();
}
}`
运行结果:`
Preparing delivery...
Driving a car...
Preparing delivery...
Riding a bicycle...`
在这个例子中,VehicleFactory 的 deliverVehicle() 方法是一个模板方法,它调用了抽象的 createVehicle() 工厂方法。具体的创建逻辑由子类 CarFactory 和 BicycleFactory 实现。客户端只需与抽象工厂和抽象产品交互,完全与具体类解耦。
优点:
- 良好的封装性:客户端无需知道所创建的具体产品类名,只需要知道对应的工厂即可。
- 优秀的可扩展性:如果需要增加新的产品,只需添加一个新的具体产品类和一个对应的具体工厂类,无需修改现有代码。
- 符合开闭原则:对扩展开放,对修改关闭。
- 解耦客户端与具体产品:客户端只依赖于抽象,降低了系统的耦合度。
适用场景:
- 当一个类无法预知它必须创建的对象的类时。
- 当一个类希望由其子类来指定它所创建的对象时。
- 当需要将对象的创建与使用分离,使系统更符合单一职责原则时。
- 在框架设计中,经常使用工厂方法模式让用户通过继承来扩展框架的功能。
初学者容易混淆工厂方法模式和简单工厂模式。它们的区别在于:
可以说,工厂方法模式是简单工厂模式的进一步抽象和推广。
工厂方法模式通过引入抽象工厂和具体工厂的层次结构,将对象的实例化延迟到子类,提供了一种灵活的扩展机制。它是面向对象设计中“依赖抽象,而非具体”这一原则的完美体现。在需要管理系统复杂性、提高代码可维护性和可扩展性的场景下,工厂方法模式是一个极具价值的工具。掌握它,能帮助开发者构建出更加健壮和灵活的软件架构。
如若转载,请注明出处:http://www.1qiyingkeji.com/product/65.html
更新时间:2026-01-13 13:34:22