课程大纲 / Lesson 03
Abstract Factory 创建型

Abstract Factory · 抽象工厂

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

01

理解抽象工厂模式:为一族相关对象提供统一创建接口

02

掌握工厂族(MacOS、Windows)与其产品(Button、Checkbox)的对应关系

03

理解抽象工厂如何保证同一工厂产出的产品风格一致性

04

了解抽象工厂与工厂方法的区别,以及各自的适用场景

核心概念
抽象工厂定义产品族一族产品来自同一工厂开闭原则风格一致性
classDiagram class guifactory { <<interface>> +createbutton() button +createcheckbox() checkbox } class macosfactory { <<stateless>> +createbutton() button +createcheckbox() checkbox } class windowsfactory { <<stateless>> +createbutton() button +createcheckbox() checkbox } class button { <<interface>> +render() +onclick() } class checkbox { <<interface>> +render() +toggle() } class macosbutton { <<stateless>> +render() +onclick() } class windowsbutton { <<stateless>> +render() +onclick() } class macoscheckbox { <<stateless>> +render() +toggle() } class windowscheckbox { <<stateless>> +render() +toggle() } guifactory <|.. macosfactory guifactory <|.. windowsfactory button <|.. macosbutton button <|.. windowsbutton checkbox <|.. macoscheckbox checkbox <|.. windowscheckbox macosfactory ..> macosbutton : creates macosfactory ..> macoscheckbox : creates windowsfactory ..> windowsbutton : creates windowsfactory ..> windowscheckbox : creates

抽象工厂创建一组相互兼容的产品,客户端仅依赖抽象接口

点击 Run 查看抽象工厂创建产品...
/** 抽象工厂接口:为一族相关产品声明创建方法 */
public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}
/** MacOS 风格工厂:同时生产 MacOSButton + MacOSCheckbox */
public class MacOSFactory implements GUIFactory {

    public Button createButton() {
        return new MacOSButton();
    }

    public Checkbox createCheckbox() {
        return new MacOSCheckbox();
    }
}
/** Windows 风格工厂:同时生产 WindowsButton + WindowsCheckbox */
public class WindowsFactory implements GUIFactory {

    public Button createButton() {
        return new WindowsButton();
    }

    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}
/** 产品接口:所有按钮实现此接口 */
public interface Button {
    void render();
    void onClick();
}
/** 产品接口:所有复选框实现此接口 */
public interface Checkbox {
    void render();
    void toggle();
}
class MacOSButton implements Button {
    public void render() { System.out.println("MacOSButton rendered"); }
    public void onClick() {}
}
class MacOSCheckbox implements Checkbox {
    public void render() { System.out.println("MacOSCheckbox rendered"); }
    public void toggle() {}
}
class WindowsButton implements Button {
    public void render() { System.out.println("WindowsButton rendered"); }
    public void onClick() {}
}
class WindowsCheckbox implements Checkbox {
    public void render() { System.out.println("WindowsCheckbox rendered"); }
    public void toggle() {}
}
public class Demo {
    private static GUIFactory factory;

    public static void main(String[] args) {
        configure();
        renderUI();
    }

    /** 根据配置选择具体工厂 */
    static void configure() {
        String os = System.getProperty("os.name");
        if (os.contains("Mac")) {
            factory = new MacOSFactory();
        } else {
            factory = new WindowsFactory();
        }
    }

    /** 客户端只认识抽象接口,同一工厂产出风格一致的产品 */
    static void renderUI() {
        Button button = factory.createButton();
        Checkbox checkbox = factory.createCheckbox();
        button.render();
        checkbox.render();
    }
}
◈

抽象工厂定义产品族

一个工厂同时负责一族(多个相关)产品的创建,而非单一产品的不同变体。

◈

一族产品来自同一工厂

MacOSButton + MacOSCheckbox 必须由 MacOSFactory 同一工厂产出,保证跨平台风格一致。

◈

遵循开闭原则

新增产品族(如 LinuxFactory + LinuxButton + LinuxCheckbox)无需修改已有代码,只需添加新类。

◈

适合多平台风格一致场景

如:跨平台 UI(每个平台有一套 Button + Checkbox + TextField)、数据库驱动(MySQL + PostgreSQL 各有一套 Connection + Statement)。