Java设计模式——工厂方法模式
⚪工厂方法模式(Factory Method)是一种创建型设计模式,这个模式有助于将对象的创建与使用分离,以提高代码的灵活性和可维护性。
⚪意图:它提供了一种创建对象的接口,但是将对象的具体创建延迟到子类中。
⚪以下是工厂方法模式的关键要点:
▷ 角色和责任:
-
抽象工厂(Creator):定义了一个创建对象的接口,通常包括一个工厂方法,子类需要实现这个方法来创建具体的对象。
-
具体工厂(Concrete Creator):实现了抽象工厂中的工厂方法,负责创建具体的产品对象。
-
抽象产品(Product):定义了产品对象的接口,工厂方法创建的对象都应该实现这个接口。
-
具体产品(Concrete Product):实现了抽象产品接口的具体对象。
▷ 工作流程:
-
客户端代码通过调用抽象工厂的工厂方法来请求创建一个产品对象,而不需要直接实例化具体产品。
-
抽象工厂的工厂方法根据具体工厂的实现来创建具体产品的对象,并将其返回给客户端。
-
客户端只需要知道抽象工厂和产品的接口,而不需要关心具体产品的创建过程。
▷ 示例
// 抽象产品
interface Shape {
void draw();
}
// 具体产品 - 圆形
class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
// 具体产品 - 矩形
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
// 抽象工厂
interface ShapeFactory {
Shape createShape();
}
// 具体工厂 - 创建圆形
class CircleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
// 具体工厂 - 创建矩形
class RectangleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
// 客户端代码
public class Client {
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();
}
}
⚪适用性
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来制定它所创建的对象的时候。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化的时候
⚪应用场景
- 框架扩展和插件系统:工厂方法常用于设计框架和插件系统,允许开发人员通过实现特定接口或继承特定类来创建自定义组件或扩展框架的功能。框架使用工厂方法来实例化这些组件,以便应用程序可以轻松地引入新的功能扩展。
- 库和API设计:当设计库或API时,工厂方法模式可以用来定义接口或抽象类,然后允许用户根据需要提供自定义实现。这样,库的用户可以通过实现工厂接口来创建自己的对象,以适应其特定的需求。
- 数据库连接池:数据库连接池通常使用工厂方法来创建数据库连接对象。这样,应用程序可以从连接池中获取连接,而不需要自己管理连接的创建和释放。
- 图形用户界面(GUI)库:GUI库中常常使用工厂方法来创建用户界面组件,如窗口、按钮、对话框等。不同的操作系统和外观可以有不同的实现,但应用程序代码可以保持不变。
- 日志记录框架:日志记录框架通常使用工厂方法来创建日志记录器对象。这允许应用程序在不同的环境中使用不同的日志记录器,而不需要修改应用程序的核心代码。
- 游戏开发:在游戏开发中,工厂方法模式常用于创建游戏对象,如角色、武器、怪物等。不同的关卡或游戏模式可以使用不同的工厂来创建不同类型的对象。
- 支付处理:在电子商务应用中,根据不同的支付方式(信用卡、PayPal、银行转账等),可以使用工厂方法来创建不同的支付处理对象。
⚪实际已有场景
- Java标准库中的
Calendar类: Java标准库中的Calendar类使用工厂方法来创建不同类型的日期和时间对象,如java.util.GregorianCalendar和java.util.JapaneseImperialCalendar。这使得可以根据需要创建不同的日历对象,而不需要直接实例化具体的日历类。 - Spring框架中的Bean创建: Spring框架广泛使用工厂方法模式来创建和管理Bean对象。在Spring配置文件中,您可以定义Bean工厂,然后配置它们以创建特定类型的Bean。Spring容器使用这些工厂方法来实例化和管理Bean的生命周期。
- Java数据库连接池: 一些Java数据库连接池库,如Apache DBCP(数据库连接池)和HikariCP,使用工厂方法来创建和管理数据库连接。这允许应用程序通过配置文件定义如何创建和管理数据库连接,以提高性能和资源管理。
- GUI库中的窗口创建: 在GUI库(如Swing或JavaFX)中,工厂方法模式可用于创建不同类型的窗口、对话框和用户界面组件。这允许开发人员根据需要创建不同样式和类型的界面元素。

浙公网安备 33010602011771号