1. 工厂方法模式与抽象工厂模式概述
在软件开发中,创建对象是最基础也最频繁的操作之一。传统的方式是直接使用new关键字实例化对象,但这种方式存在明显的耦合问题——客户端代码直接依赖于具体实现类。工厂模式系列就是为了解决这个问题而生的。
工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)都属于创建型设计模式,它们都遵循"对象创建应该对扩展开放,对修改关闭"的原则。简单来说,就是当我们需要创建对象时,不应该直接new具体类,而是通过工厂来创建,这样当需要新增或修改对象类型时,就不需要修改已有代码。
这两种模式虽然都叫"工厂",但解决的问题和应用场景有所不同。工厂方法模式主要解决"单个产品"的创建问题,而抽象工厂模式则解决"产品族"的创建问题。理解它们的区别和适用场景,对于设计灵活、可扩展的系统架构至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工厂方法模式详解
2.1 工厂方法模式的定义与结构
工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类进行。
它的结构包含以下几个关键角色:
- Product(抽象产品):定义产品的接口
- ConcreteProduct(具体产品):实现Product接口的具体类
- Creator(抽象工厂):声明工厂方法,返回Product类型对象
- ConcreteCreator(具体工厂):重写工厂方法,返回具体的ConcreteProduct实例
2.2 工厂方法模式的实现示例
以日志记录器为例,我们可能有文件日志和数据库日志两种实现:
java复制// 抽象产品
interface Logger {
void log(String message);
}
// 具体产品
class FileLogger implements Logger {
public void log(String message) {
System.out.println("记录到文件:" + message);
}
}
class DatabaseLogger implements Logger {
public void log(String message) {
System.out.println("记录到数据库:" + message);
}
}
// 抽象工厂
interface LoggerFactory {
Logger createLogger();
}
// 具体工厂
class FileLoggerFactory implements LoggerFactory {
public Logger createLogger() {
return new FileLogger();
}
}
class DatabaseLoggerFactory implements LoggerFactory {
public Logger createLogger() {
return new DatabaseLogger();
}
}
2.3 工厂方法模式的应用场景
工厂方法模式特别适用于以下场景:
- 当一个类不知道它需要创建哪个类的对象时
- 当一个类希望由其子类来指定它所创建的对象时
- 当需要将对象的创建与使用分离时
在实际开发中,Spring框架的BeanFactory就是工厂方法模式的典型应用。它定义了getBean()方法来获取对象,具体的对象创建则由各种BeanDefinition决定。
3. 抽象工厂模式详解
3.1 抽象工厂模式的定义与结构
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
它的结构包含以下角色:
- AbstractFactory(抽象工厂):声明创建一系列产品的方法
- ConcreteFactory(具体工厂):实现抽象工厂中定义的方法,创建具体产品
- AbstractProduct(抽象产品):为每种产品声明接口
- ConcreteProduct(具体产品):定义具体工厂创建的具体产品对象
3.2 抽象工厂模式的实现示例
考虑一个跨平台的UI组件库,需要为不同操作系统创建风格一致的按钮和文本框:
java复制// 抽象产品
interface Button {
void render();
}
interface TextBox {
void display();
}
// 具体产品 - Windows风格
class WindowsButton implements Button {
public void render() {
System.out.println("渲染Windows风格按钮");
}
}
class WindowsTextBox implements TextBox {
public void display() {
System.out.println("显示Windows风格文本框");
}
}
// 具体产品 - Mac风格
class MacButton implements Button {
public void render() {
System.out.println("渲染Mac风格按钮");
}
}
class MacTextBox implements TextBox {
public void display() {
System.out.println("显示Mac风格文本框");
}
}
// 抽象工厂
interface GUIFactory {
Button createButton();
TextBox createTextBox();
}
// 具体工厂
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public TextBox createTextBox() {
return new Wind
