如何结合Builder与Abstract Factory设计模式实现多风格复杂GUI?
跨风格GUI的Builder+抽象工厂组合实现方案
两种模式职责完全解耦:
- 抽象工厂模式:负责生产对应操作系统风格的所有UI组件实例,屏蔽不同风格组件的创建差异
- Builder模式:负责执行固定的主面板组装流程,屏蔽组件组装的顺序和细节
具体实现步骤
- 定义抽象UI组件族
先抽离所有UI组件的公共接口,包含MainPanel、ListPanel、ButtonPanel、Button四个抽象类/接口,每个接口对应实现Linux风格、Windows风格的具体组件类,比如LinuxMainPanel、WindowsButton等。 - 实现抽象工厂层
定义GUIFactory抽象工厂接口,声明四个创建UI组件的方法:createMainPanel()、createListPanel()、createButtonPanel()、createButton(name)。分别实现LinuxGUIFactory和WindowsGUIFactory两个具体工厂,每个工厂生产对应风格的UI组件。 - 实现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
相关产品推荐
相关产品推荐

