介绍
工厂方法模式是一种创建型设计模式,它提供了一种将对象的创建委托给子类的方式。工厂方法模式通过定义一个创建对象的接口,但将具体的对象创建延迟到子类中实现。这样可以在不改变客户端代码的情况下,通过添加新的子类来创建不同的对象。
工厂方法模式是一种非常灵活的模式,它允许我们根据需要动态地创建具体对象,而无需在客户端代码中直接实例化对象。这样可以提高代码的可扩展性和可维护性。
结构
工厂方法模式包含以下几个角色:
- 抽象产品类(Product):定义产品的共同接口,具体产品类都实现了这个接口。
- 具体产品类(Concrete Product):实现抽象产品类接口的具体产品。
- 抽象工厂类(Creator):定义创建产品的工厂方法,返回抽象产品类型的对象。
- 具体工厂类(Concrete Creator):实现抽象工厂类的工厂方法,返回具体产品类型的对象。
下面是一个简单的类图示例:
+-------------------+
| Creator |
+-------------------+
| + factoryMethod() |
+-------------------+
^
|
+-------------------+
| Product |
+-------------------+
| + operation() |
+-------------------+
^
|
+-------------------+
| ConcreteProduct |
+-------------------+
| + operation() |
+-------------------+
示例
假设我们有一个图形绘制应用程序,可以绘制不同形状的图形,如圆形、矩形和三角形。我们可以使用工厂方法模式来创建这些图形对象。
首先,我们定义一个抽象图形类 Shape
:
public abstract class Shape {
public abstract void draw();
}
然后,我们创建具体的图形类,如 Circle
、Rectangle
和 Triangle
,它们都继承自 Shape
类并实现了 draw()
方法:
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
public class Triangle extends Shape {
@Override
public void draw() {
System.out.println("绘制三角形");
}
}
接下来,我们创建一个抽象工厂类 ShapeFactory
,其中包含一个抽象的工厂方法 createShape()
,由具体工厂类来实现:
public abstract class ShapeFactory {
public abstract Shape createShape();
}
然后,我们创建具体的工厂类,如 CircleFactory
、RectangleFactory
和 TriangleFactory
,它们分别继承自 ShapeFactory
并实现了 createShape()
方法:
public class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
public class RectangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
public class TriangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Triangle();
}
}
最后,我们可以使用工厂方法来创建和使用图形对象:
public class Main {
public static void main(String[] args) {
ShapeFactory circleFactory = new CircleFactory();
Shape circle = circleFactory.createShape();
circle.draw(); // 输出:绘制圆形
ShapeFactory rectangleFactory = new RectangleFactory();
Shape rectangle = rectangleFactory.createShape();
rectangle.draw(); // 输出:绘制矩形
ShapeFactory triangleFactory = new TriangleFactory();
Shape triangle = triangleFactory.createShape();
triangle.draw(); // 输出:绘制三角形
}
}
优点和适用场景
工厂方法模式具有以下优点:
- 将对象的创建逻辑推迟到子类中实现,使得客户端代码与具体产品的创建过程解耦。
- 可以通过添加新的具体工厂类来扩展系统,而无需修改现有的客户端代码。
- 具体工厂类可以根据需要返回不同的具体产品对象,实现了多态性。
工厂方法模式适用于以下场景:
- 需要根据不同的条件创建不同的对象。
- 对象的创建逻辑较为复杂,需要在运行时动态决定具体对象的类型。
- 客户端不需要知道对象的具体创建过程,只需要知道抽象工厂类和抽象产品类即可。
总结
工厂方法模式是一种常用且灵活的创建型设计模式,它通过将对象的创建委托给子类来实现对象的创建和管理。工厂方法模式可以帮助我们提高代码的可扩展性和可维护性,同时将客户端代码与具体产品的创建过程解耦。
公众号请关注"果酱桑", 一起学习,一起进步!