设计模式-工厂方法模式(一)

2023-05-03 14:43:33 浏览数 (1)

工厂方法模式是一种常见的创建型设计模式,它通过定义一个工厂接口和多个具体工厂类来创建不同类型的对象,将对象的创建过程与客户端解耦,提高了系统的灵活性和可扩展性。

概念

工厂方法模式定义了一个工厂接口和多个具体工厂类,每个具体工厂类都实现了工厂接口,用于创建特定类型的对象。客户端通过调用具体工厂类的工厂方法来创建不同类型的对象,而无需了解对象的具体创建过程。

结构

工厂方法模式包含四个角色:抽象产品类、具体产品类、抽象工厂类和具体工厂类。

抽象产品类

抽象产品类定义了产品的公共接口和属性,具体产品类继承抽象产品类并实现其接口和属性。

具体产品类

具体产品类继承抽象产品类并实现其接口和属性,用于创建特定类型的产品。

抽象工厂类

抽象工厂类定义了工厂方法的接口,用于创建抽象产品类的对象。

具体工厂类

具体工厂类实现抽象工厂类的工厂方法,用于创建特定类型的具体产品类的对象。

应用场景

工厂方法模式适用于以下场景:

  1. 系统中需要创建多个具有共同接口的对象。
  2. 客户端不关心对象的具体创建过程,只需要知道如何使用对象。
  3. 需要灵活地添加新的产品类,而不影响现有的客户端代码。

示例代码

假设我们要实现一个图形工厂,根据客户端传入的参数创建不同类型的图形对象。我们可以先定义抽象产品类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;
    }
}

0 人点赞