跳转到内容

抽象工厂模式

来自代码酷

模板:Note

抽象工厂模式[编辑 | 编辑源代码]

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们的具体类。该模式围绕一个超级工厂(抽象工厂)展开,该工厂可以创建其他工厂(具体工厂),这些工厂又负责生成特定系列的产品。

核心思想[编辑 | 编辑源代码]

抽象工厂模式的核心在于:

  • 定义一个抽象工厂接口,声明一组创建产品的方法。
  • 每个具体工厂实现该接口,负责生产特定系列的产品。
  • 客户端代码仅通过抽象接口与工厂和产品交互,无需关心具体实现。

适用场景[编辑 | 编辑源代码]

  • 需要创建一组相关或依赖的对象。
  • 系统需要独立于其产品的创建、组合和表示。
  • 系统需要配置多个产品系列中的一个。

结构[编辑 | 编辑源代码]

classDiagram class AbstractFactory { <<interface>> +createProductA() AbstractProductA +createProductB() AbstractProductB } class ConcreteFactory1 { +createProductA() AbstractProductA +createProductB() AbstractProductB } class ConcreteFactory2 { +createProductA() AbstractProductA +createProductB() AbstractProductB } class AbstractProductA { <<interface>> +operationA() String } class AbstractProductB { <<interface>> +operationB() String } class ProductA1 { +operationA() String } class ProductA2 { +operationA() String } class ProductB1 { +operationB() String } class ProductB2 { +operationB() String } AbstractFactory <|-- ConcreteFactory1 AbstractFactory <|-- ConcreteFactory2 AbstractProductA <|-- ProductA1 AbstractProductA <|-- ProductA2 AbstractProductB <|-- ProductB1 AbstractProductB <|-- ProductB2 ConcreteFactory1 --> ProductA1 ConcreteFactory1 --> ProductB1 ConcreteFactory2 --> ProductA2 ConcreteFactory2 --> ProductB2

关键组件[编辑 | 编辑源代码]

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
  • 具体工厂:MySQLFactoryPostgreSQLFactory
  • 抽象产品:ConnectionCommand
  • 具体产品:MySQLConnectionPostgreSQLCommand

优缺点[编辑 | 编辑源代码]

优点[编辑 | 编辑源代码]

  • 确保产品系列的一致性。
  • 客户端代码与具体类解耦。
  • 符合开闭原则(新增产品系列容易)。

缺点[编辑 | 编辑源代码]

  • 扩展新产品种类困难(需修改抽象工厂接口)。
  • 增加了系统复杂度。

总结[编辑 | 编辑源代码]

抽象工厂模式是创建一组相关对象的强大工具,尤其适合需要确保产品兼容性的场景。通过抽象接口隔离具体实现,它提升了代码的灵活性和可维护性。