跳至主要內容

抽象工厂模式

Mr.Hope...大约 2 分钟

抽象工厂是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

使用示例: 抽象工厂模式在 Java 代码中很常见。 许多框架和程序库会将它作为扩展和自定义其标准组件的一种方式。

以下是来自核心 Java 程序库的一些示例:

识别方法: 我们可以通过方法来识别该模式——其会返回一个工厂对象。 接下来, 工厂将被用于创建特定的子组件。

跨平台 GUI 组件系列及其创建方式

在本例中, 按钮和复选框将被作为产品。 它们有两个变体: macOS 版和 Windows 版。

抽象工厂定义了用于创建按钮和复选框的接口。 而两个具体工厂都会返回同一变体的两个产品。

客户端代码使用抽象接口与工厂和产品进行交互。 同样的代码能与依赖于不同工厂对象类型的多种产品变体进行交互。

项目结构

image-20240428150932006

buttons: 第一个产品层次结构

buttons/Button.java

public interface Button {
    void paint();
}

buttons/MacOSButton.java

public class MacOSButton implements Button{

    @Override
    public void paint() {
        System.out.println("绘制了MacOS按钮");
    }
}

buttons/WindowsOSButton.java

public class WindowsOSButton implements Button{

    @Override
    public void paint() {
        System.out.println("绘制WindowsOS按钮");
    }
}

checkboxes: 第二个产品层次结构

checkboxes/Checkbox.java

public interface Checkbox {
    void paint();
}

checkboxes/MacOSCheckbox.java

public class MacOSCheckbox implements Checkbox{

    @Override
    public void paint() {
        System.out.println("绘制了MacOS风格的复选框");
    }
}

checkboxes/WindowsOSCheckbox.java

public class WindowsOSCheckbox implements Checkbox{
    @Override
    public void paint() {
        System.out.println("绘制了WindowsOS风格的复选框");
    }
}

factories

factories/GUIFactory.java: 抽象工厂

public interface GUIFactory {
    // 创建按钮
    Button createButton();

    // 创建复选框
    Checkbox createCheckBox();
}

factories/MacOSFactory.java: 具体工厂 ( mac­OS)

public class MacOSFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacOSButton();
    }

    @Override
    public Checkbox createCheckBox() {
        return new MacOSCheckbox();
    }
}

factories/WindowsFactory.java: 具体工厂 (Windows)

public class WindowsFactory implements GUIFactory{
    @Override
    public Button createButton() {
        return new WindowsOSButton();
    }

    @Override
    public Checkbox createCheckBox() {
        return new WindowsOSCheckbox();
    }
}

app

app/Application.java: 客户端代码

public class Application {
    private final Button button;
    private final Checkbox checkbox;

    public Application(GUIFactory factory){
        this.button = factory.createButton();
        this.checkbox = factory.createCheckBox();
    }

    public void paint(){
        button.paint();
        checkbox.paint();
    }
}

Demo

public class Main {
    public static void main(String[] args) {
        GUIFactory factory;
        Application application;
        // 读取配置文件,获取GUI类型
        String osName = System.getProperty("os.name");
        osName = osName.toLowerCase();
        if(osName.contains("windows")){
            factory = new WindowsFactory();
        }else if (osName.contains("mac")){
            factory = new WindowsFactory();
        }else {
            throw new RuntimeException("未知的操作系统");
        }
        application = new Application(factory);
        application.paint();
    }
}

结果:

运行结果