Skip to content

抽象工厂

更新: 6/28/2025 字数: 0 字 时长: 0 分钟

定义

抽象工厂模式 (Abstract Factory Pattern) 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

角色

  • 抽象工厂 (AbstractFactory): 声明创建产品族的方法
  • 具体工厂 (ConcreteFactory): 实现创建产品族的方法
  • 抽象产品 (AbstractProduct): 为产品声明接口
  • 具体产品 (ConcreteProduct): 实现抽象产品接口

实现

java
// 抽象产品 A
interface Button {
    void render();
}

// 具体产品 A1
class WindowsButton implements Button {
    @Override
    public void render() {
        System.out.println("渲染 Windows 风格按钮");
    }
}

// 具体产品 A2
class MacButton implements Button {
    @Override
    public void render() {
        System.out.println("渲染 Mac 风格按钮");
    }
}

// 抽象产品 B
interface Checkbox {
    void check();
}

// 具体产品 B1
class WindowsCheckbox implements Checkbox {
    @Override
    public void check() {
        System.out.println("Windows 复选框选中");
    }
}

// 具体产品 B2
class MacCheckbox implements Checkbox {
    @Override
    public void check() {
        System.out.println("Mac 复选框选中");
    }
}

// 抽象工厂
interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// 具体工厂 1
class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }
    
    @Override
    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}

// 具体工厂 2
class MacFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }
    
    @Override
    public Checkbox createCheckbox() {
        return new MacCheckbox();
    }
}

// 客户端
public class Application {
    private Button button;
    private Checkbox checkbox;
    
    public Application(GUIFactory factory) {
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }
    
    public void paint() {
        button.render();
        checkbox.check();
    }
    
    public static void main(String[] args) {
        // 创建 Windows 风格应用
        Application windowsApp = new Application(new WindowsFactory());
        windowsApp.paint();
        
        // 创建 Mac 风格应用
        Application macApp = new Application(new MacFactory());
        macApp.paint();
    }
}

优缺点

优点:

  1. 确保产品兼容性(同一工厂创建的产品能协同工作)
  2. 避免客户端与具体产品类耦合
  3. 单一职责原则:产品创建代码集中在单一位置
  4. 开闭原则:引入新产品族时无需修改现有代码

缺点:

  1. 需要定义大量接口和类,增加系统复杂度
  2. 支持新种类的产品困难(需要修改抽象工厂接口)

应用场景

  1. 系统需要独立于其产品的创建、组合和表示方式
  2. 系统需要配置多个产品族中的一个
  3. 需要强调一系列相关产品对象的设计以便联合使用
  4. 提供产品类库,只暴露接口不暴露实现

与工厂方法的区别

  • 抽象工厂创建产品族,工厂方法创建单一产品
  • 抽象工厂通过组合实现,工厂方法通过继承实现
  • 抽象工厂更注重产品间的兼容性

贡献者

The avatar of contributor named as AKAcxp AKAcxp

页面历史