Skip to content

抽象工厂模式

基础概念

什么是抽象工厂模式?

答案: 抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

使用场景

  • 系统需要独立于产品的创建、组合和表示
  • 系统需要由多个产品系列中的一个来配置
  • 需要强调一系列相关产品对象的设计以便联合使用

优点

  • 隔离具体类的生成
  • 易于交换产品系列
  • 有利于产品的一致性

缺点

  • 难以支持新种类的产品

实现方式

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

// 抽象产品B
public interface TextField {
    void input(String text);
}

// 具体产品:Windows按钮
public class WindowsButton implements Button {
    @Override
    public void click() {
        System.out.println("Windows按钮点击");
    }
}

// 具体产品:Mac按钮
public class MacButton implements Button {
    @Override
    public void click() {
        System.out.println("Mac按钮点击");
    }
}

// 具体产品:Windows文本框
public class WindowsTextField implements TextField {
    @Override
    public void input(String text) {
        System.out.println("Windows文本框输入: " + text);
    }
}

// 具体产品:Mac文本框
public class MacTextField implements TextField {
    @Override
    public void input(String text) {
        System.out.println("Mac文本框输入: " + text);
    }
}

// 抽象工厂
public interface GUIFactory {
    Button createButton();
    TextField createTextField();
}

// 具体工厂:Windows工厂
public class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public TextField createTextField() {
        return new WindowsTextField();
    }
}

// 具体工厂:Mac工厂
public class MacFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public TextField createTextField() {
        return new MacTextField();
    }
}

// 使用
GUIFactory factory = new WindowsFactory();
Button button = factory.createButton();
TextField textField = factory.createTextField();
button.click();
textField.input("Hello");

练习题

  1. 抽象工厂和工厂方法的区别?
  2. 如何扩展新的产品族?
  3. 抽象工厂模式的应用场景?

Released under the MIT License.