精读《设计模式 - Factory Method 工厂方法》:理解面向接口编程的精髓
2024-01-29 11:08:03
工厂方法模式:将对象创建与实现分离
概述
工厂方法模式是一种设计模式,它旨在将对象的创建与对象的实现分开。通过这样做,我们可以提高代码的可重用性、可扩展性和可测试性。
好处
- 可重用性: 将对象创建与实现分离后,我们可以将对象创建逻辑集中在一个地方,从而便于重用。
- 可扩展性: 如果我们想添加新的对象类型,只需创建一个新的具体类来实现抽象类或接口,而无需更改现有代码。
- 可测试性: 工厂方法模式使我们能够轻松测试对象的创建逻辑,因为它与对象的实现是分离的。
应用场景
工厂方法模式可用于以下场景:
- 当我们需要创建具有多种不同配置的对象时。
- 当我们需要创建对象,但对象的类型在运行时才知道时。
- 当我们需要在不同的平台上创建对象时。
实现
工厂方法模式可以通过创建一个抽象类或接口来实现,该类或接口定义了对象的行为,但不指定对象的创建方式。然后,我们可以创建多个具体类来实现这个抽象类或接口,每个具体类都提供了一种不同的对象创建方式。
例如,我们可以创建一个抽象类 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. 什么时候应该使用工厂方法模式?
当我们需要创建具有多种不同配置的对象,并且对象的类型在运行时才知道时,或者需要在不同的平台上创建对象时,可以使用工厂方法模式。