You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合Builder与Abstract Factory设计模式实现多风格复杂GUI?

跨风格GUI的Builder+抽象工厂组合实现方案

两种模式职责完全解耦:

  • 抽象工厂模式:负责生产对应操作系统风格的所有UI组件实例,屏蔽不同风格组件的创建差异
  • Builder模式:负责执行固定的主面板组装流程,屏蔽组件组装的顺序和细节

具体实现步骤
  1. 定义抽象UI组件族
    先抽离所有UI组件的公共接口,包含MainPanel、ListPanel、ButtonPanel、Button四个抽象类/接口,每个接口对应实现Linux风格、Windows风格的具体组件类,比如LinuxMainPanel、WindowsButton等。
  2. 实现抽象工厂层
    定义GUIFactory抽象工厂接口,声明四个创建UI组件的方法:createMainPanel()、createListPanel()、createButtonPanel()、createButton(name)。分别实现LinuxGUIFactory和WindowsGUIFactory两个具体工厂,每个工厂生产对应风格的UI组件。
  3. 实现Builder层
    定义MainPanelBuilder抽象建造者接口,声明对应构建流程的五个方法:
constructMainPanel()
constructListPanel(mainpanel)
constructButtonPanel(mainPanel)
constructButton(name, buttonPanel)
getResult()

实现具体建造者ConcreteMainPanelBuilder,内部持有一个GUIFactory实例和待构建的主面板实例,每个构造方法调用工厂生产对应组件,再完成组装逻辑。
4. 实现Director层
Director类持有MainPanelBuilder实例,内部的construct()方法封装固定的组装流程,完全复现你给出的五步调用顺序,不管切换什么风格的工厂,组装流程都不会修改。


调用示例
// 需要Windows风格就传入WindowsGUIFactory,切换Linux只需要改这一行
GUIFactory winFactory = new WindowsGUIFactory();
MainPanelBuilder builder = new ConcreteMainPanelBuilder(winFactory);
Director director = new Director(builder);
// 执行固定构建流程
director.construct();
// 获取最终构建完成的主面板
MainPanel winStylePanel = builder.getResult();

类图结构
classDiagram
    direction LR
    %% 抽象组件族
    class MainPanel {<<interface>>}
    class LinuxMainPanel {实现MainPanel Linux风格}
    class WindowsMainPanel {实现MainPanel Windows风格}
    class ListPanel {<<interface>>}
    class LinuxListPanel {实现ListPanel Linux风格}
    class WindowsListPanel {实现ListPanel Windows风格}
    class ButtonPanel {<<interface>>}
    class LinuxButtonPanel {实现ButtonPanel Linux风格}
    class WindowsButtonPanel {实现ButtonPanel Windows风格}
    class Button {<<interface>>}
    class LinuxButton {实现Button Linux风格}
    class WindowsButton {实现Button Windows风格}

    %% 抽象工厂层
    class GUIFactory {
        <<interface>>
        +createMainPanel() MainPanel
        +createListPanel() ListPanel
        +createButtonPanel() ButtonPanel
        +createButton(String name) Button
    }
    class LinuxGUIFactory {生产Linux风格全量组件}
    class WindowsGUIFactory {生产Windows风格全量组件}

    %% Builder层
    class MainPanelBuilder {
        <<interface>>
        +constructMainPanel()
        +constructListPanel()
        +constructButtonPanel()
        +constructButton(String name)
        +getResult() MainPanel
    }
    class ConcreteMainPanelBuilder {
        -GUIFactory factory
        -MainPanel targetPanel
        +实现所有Builder接口方法
    }

    %% Director层
    class Director {
        -MainPanelBuilder builder
        +construct()
    }

    %% 继承关系
    MainPanel <|-- LinuxMainPanel
    MainPanel <|-- WindowsMainPanel
    ListPanel <|-- LinuxListPanel
    ListPanel <|-- WindowsListPanel
    ButtonPanel <|-- LinuxButtonPanel
    ButtonPanel <|-- WindowsButtonPanel
    Button <|-- LinuxButton
    Button <|-- WindowsButton
    GUIFactory <|-- LinuxGUIFactory
    GUIFactory <|-- WindowsGUIFactory
    MainPanelBuilder <|-- ConcreteMainPanelBuilder

    %% 依赖关系
    ConcreteMainPanelBuilder *-- GUIFactory
    Director *-- MainPanelBuilder

内容的提问来源于stack exchange,提问作者Reshma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:27:05