返回

精读《设计模式 - Factory Method 工厂方法》:理解面向接口编程的精髓

前端

工厂方法模式:将对象创建与实现分离

概述

工厂方法模式是一种设计模式,它旨在将对象的创建与对象的实现分开。通过这样做,我们可以提高代码的可重用性、可扩展性和可测试性。

好处

  • 可重用性: 将对象创建与实现分离后,我们可以将对象创建逻辑集中在一个地方,从而便于重用。
  • 可扩展性: 如果我们想添加新的对象类型,只需创建一个新的具体类来实现抽象类或接口,而无需更改现有代码。
  • 可测试性: 工厂方法模式使我们能够轻松测试对象的创建逻辑,因为它与对象的实现是分离的。

应用场景

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

  • 当我们需要创建具有多种不同配置的对象时。
  • 当我们需要创建对象,但对象的类型在运行时才知道时。
  • 当我们需要在不同的平台上创建对象时。

实现

工厂方法模式可以通过创建一个抽象类或接口来实现,该类或接口定义了对象的行为,但不指定对象的创建方式。然后,我们可以创建多个具体类来实现这个抽象类或接口,每个具体类都提供了一种不同的对象创建方式。

例如,我们可以创建一个抽象类 Shape,它定义了形状的行为,但不指定形状的创建方式。然后,我们可以创建多个具体类来实现 Shape 类,例如 Circle 类、Square 类和 Rectangle 类。每个具体类都提供了一种创建形状的不同方式。

// 抽象类 Shape
public abstract class Shape {
    public abstract double getArea();
    public abstract double getPerimeter();
}

// 具体类 Circle
public class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public double getPerimeter() {
        return 2 * Math.PI * radius;
    }
}

// 具体类 Square
public class Square extends Shape {
    private double sideLength;

    public Square(double sideLength) {
        this.sideLength = sideLength;
    }

    @Override
    public double getArea() {
        return sideLength * sideLength;
    }

    @Override
    public double getPerimeter() {
        return 4 * sideLength;
    }
}

// 具体类 Rectangle
public class Rectangle extends Shape {
    private double length;
    private double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    public double getArea() {
        return length * width;
    }

    @Override
    public double getPerimeter() {
        return 2 * (length + width);
    }
}

// 工厂类 ShapeFactory
public class ShapeFactory {
    public static Shape createShape(String shapeType) {
        switch (shapeType) {
            case "circle":
                return new Circle(5);
            case "square":
                return new Square(5);
            case "rectangle":
                return new Rectangle(5, 10);
            default:
                throw new IllegalArgumentException("Invalid shape type");
        }
    }
}

// 主类
public class Main {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        Shape circle = shapeFactory.createShape("circle");
        Shape square = shapeFactory.createShape("square");
        Shape rectangle = shapeFactory.createShape("rectangle");

        System.out.println("Circle area: " + circle.getArea());
        System.out.println("Circle perimeter: " + circle.getPerimeter());
        System.out.println("Square area: " + square.getArea());
        System.out.println("Square perimeter: " + square.getPerimeter());
        System.out.println("Rectangle area: " + rectangle.getArea());
        System.out.println("Rectangle perimeter: " + rectangle.getPerimeter());
    }
}

在这个示例中,ShapeFactory 类是一个工厂类,它提供了创建不同类型形状对象的方法。Shape 类是一个抽象类,它定义了形状的行为,但不指定形状的创建方式。Circle 类、Square 类和 Rectangle 类是 Shape 类的具体类,它们提供了创建不同类型形状对象的方法。

结论

工厂方法模式是一种非常有用的设计模式,它可以帮助我们提高代码的可重用性、可扩展性和可测试性。工厂方法模式非常适合用于创建具有多种不同配置的对象,它允许我们使用不同的工厂来创建不同的对象,而无需更改创建对象的代码。

常见问题解答

1. 什么是工厂方法模式?

工厂方法模式是一种设计模式,它将对象的创建与对象的实现分开,提高代码的可重用性、可扩展性和可测试性。

2. 工厂方法模式有什么好处?

  • 提高可重用性
  • 提高可扩展性
  • 提高可测试性

3. 工厂方法模式有什么应用场景?

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

  • 创建具有多种不同配置的对象
  • 创建对象,但对象的类型在运行时才知道
  • 在不同的平台上创建对象

4. 如何实现工厂方法模式?

工厂方法模式可以通过创建一个抽象类或接口来实现,该类或接口定义了对象的行为,但不指定对象的创建方式。然后,我们可以创建多个具体类来实现这个抽象类或接口,每个具体类都提供了一种不同的对象创建方式。

5. 什么时候应该使用工厂方法模式?

当我们需要创建具有多种不同配置的对象,并且对象的类型在运行时才知道时,或者需要在不同的平台上创建对象时,可以使用工厂方法模式。