工厂方法模式是一种常见的创建型设计模式,它通过定义一个工厂接口和多个具体工厂类来创建不同类型的对象,将对象的创建过程与客户端解耦,提高了系统的灵活性和可扩展性。
概念
工厂方法模式定义了一个工厂接口和多个具体工厂类,每个具体工厂类都实现了工厂接口,用于创建特定类型的对象。客户端通过调用具体工厂类的工厂方法来创建不同类型的对象,而无需了解对象的具体创建过程。
结构
工厂方法模式包含四个角色:抽象产品类、具体产品类、抽象工厂类和具体工厂类。
抽象产品类
抽象产品类定义了产品的公共接口和属性,具体产品类继承抽象产品类并实现其接口和属性。
具体产品类
具体产品类继承抽象产品类并实现其接口和属性,用于创建特定类型的产品。
抽象工厂类
抽象工厂类定义了工厂方法的接口,用于创建抽象产品类的对象。
具体工厂类
具体工厂类实现抽象工厂类的工厂方法,用于创建特定类型的具体产品类的对象。
应用场景
工厂方法模式适用于以下场景:
- 系统中需要创建多个具有共同接口的对象。
- 客户端不关心对象的具体创建过程,只需要知道如何使用对象。
- 需要灵活地添加新的产品类,而不影响现有的客户端代码。
示例代码
假设我们要实现一个图形工厂,根据客户端传入的参数创建不同类型的图形对象。我们可以先定义抽象产品类Shape,具体产品类Circle、Square、Rectangle继承自Shape。然后定义抽象工厂类ShapeFactory,具体工厂类CircleFactory、SquareFactory、RectangleFactory实现ShapeFactory接口,用于创建对应的具体产品类的对象。
抽象产品类Shape:
代码语言:javascript复制public abstract class Shape {
// 计算图形周长
public abstract double calculatePerimeter();
// 计算图形面积
public abstract double calculateArea();
}
具体产品类Circle:
代码语言:javascript复制public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculatePerimeter() {
return 2 * Math.PI * radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}