抽象工厂模式
外观
抽象工厂模式[编辑 | 编辑源代码]
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们的具体类。该模式围绕一个超级工厂(抽象工厂)展开,该工厂可以创建其他工厂(具体工厂),这些工厂又负责生成特定系列的产品。
核心思想[编辑 | 编辑源代码]
抽象工厂模式的核心在于:
- 定义一个抽象工厂接口,声明一组创建产品的方法。
- 每个具体工厂实现该接口,负责生产特定系列的产品。
- 客户端代码仅通过抽象接口与工厂和产品交互,无需关心具体实现。
适用场景[编辑 | 编辑源代码]
- 需要创建一组相关或依赖的对象。
- 系统需要独立于其产品的创建、组合和表示。
- 系统需要配置多个产品系列中的一个。
结构[编辑 | 编辑源代码]
关键组件[编辑 | 编辑源代码]
1. AbstractFactory:声明创建抽象产品的方法。 2. ConcreteFactory:实现抽象工厂的方法,生成具体产品。 3. AbstractProduct:声明产品的接口。 4. ConcreteProduct:实现抽象产品的接口。
代码示例[编辑 | 编辑源代码]
以下是一个Java示例,展示如何实现抽象工厂模式。
定义抽象产品和工厂[编辑 | 编辑源代码]
// 抽象产品A
interface Button {
void render();
}
// 抽象产品B
interface Checkbox {
void render();
}
// 抽象工厂
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
具体产品和工厂[编辑 | 编辑源代码]
// 具体产品A1
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("Render a Windows button");
}
}
// 具体产品B1
class WindowsCheckbox implements Checkbox {
@Override
public void render() {
System.out.println("Render a Windows checkbox");
}
}
// 具体工厂1
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
// 具体产品A2
class MacOSButton implements Button {
@Override
public void render() {
System.out.println("Render a macOS button");
}
}
// 具体产品B2
class MacOSCheckbox implements Checkbox {
@Override
public void render() {
System.out.println("Render a macOS checkbox");
}
}
// 具体工厂2
class MacOSFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacOSButton();
}
@Override
public Checkbox createCheckbox() {
return new MacOSCheckbox();
}
}
客户端代码[编辑 | 编辑源代码]
public class Application {
private Button button;
private Checkbox checkbox;
public Application(GUIFactory factory) {
button = factory.createButton();
checkbox = factory.createCheckbox();
}
public void render() {
button.render();
checkbox.render();
}
public static void main(String[] args) {
// 使用Windows工厂
Application app1 = new Application(new WindowsFactory());
app1.render();
// 使用macOS工厂
Application app2 = new Application(new MacOSFactory());
app2.render();
}
}
输出[编辑 | 编辑源代码]
Render a Windows button Render a Windows checkbox Render a macOS button Render a macOS checkbox
实际应用案例[编辑 | 编辑源代码]
抽象工厂模式常用于以下场景: 1. 跨平台UI库(如Java AWT/Swing、Qt)。 2. 数据库访问层(支持多种数据库如MySQL、PostgreSQL)。 3. 游戏开发(为不同角色生成配套的武器、装备等)。
数据库访问示例[编辑 | 编辑源代码]
假设需要支持MySQL和PostgreSQL两种数据库:
- 抽象工厂:
DatabaseFactory
- 具体工厂:
MySQLFactory
、PostgreSQLFactory
- 抽象产品:
Connection
、Command
- 具体产品:
MySQLConnection
、PostgreSQLCommand
等
优缺点[编辑 | 编辑源代码]
优点[编辑 | 编辑源代码]
- 确保产品系列的一致性。
- 客户端代码与具体类解耦。
- 符合开闭原则(新增产品系列容易)。
缺点[编辑 | 编辑源代码]
- 扩展新产品种类困难(需修改抽象工厂接口)。
- 增加了系统复杂度。
总结[编辑 | 编辑源代码]
抽象工厂模式是创建一组相关对象的强大工具,尤其适合需要确保产品兼容性的场景。通过抽象接口隔离具体实现,它提升了代码的灵活性和可维护性。