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

仅拥有GameGUI类时,如何正确应用工厂方法模式?

正确应用工厂方法模式的方案

你的核心问题是把「用继承做GUI配置」的不良实践替换为工厂模式,但误解了工厂方法的适用场景——工厂方法并非必须对应多个产品类,它同样可以用来封装同一产品类的不同配置变体,完美解决你的问题。

具体实现步骤

  1. 定义单一职责的工厂接口
    只需要一个工厂方法,负责创建并配置好GameGUI实例,完全符合单一职责:
public interface GameGUIFactory {
    // 工厂方法:返回配置完成的GameGUI实例
    GameGUI createGameGUI();
}
  1. 为每种GUI配置实现具体工厂类
    针对你之前的SimpleGUI这类配置需求,创建对应的具体工厂,每个工厂只负责一种GUI的配置逻辑:
public class SimpleGUIFactory implements GameGUIFactory {
    @Override
    public GameGUI createGameGUI() {
        GameGUI gui = new GameGUI();
        // 这里完成SimpleGUI的所有配置:添加按钮、文本框等元素
        gui.addElement(new Button("开始游戏", 100, 200));
        gui.addElement(new TextBox("输入昵称", 100, 300));
        // 其他配置逻辑(比如设置背景、绑定事件)
        gui.setBackground("simple_bg.png");
        return gui;
    }
}

如果后续需要新增其他GUI配置(比如设置界面、菜单界面),只需要新增对应的工厂类即可:

public class SettingsGUIFactory implements GameGUIFactory {
    @Override
    public GameGUI createGameGUI() {
        GameGUI gui = new GameGUI();
        gui.addElement(new Button("音效设置", 150, 250));
        gui.addElement(new Button("画面设置", 150, 350));
        return gui;
    }
}
  1. 使用工厂获取配置好的GUI
    业务代码中只需要依赖GameGUIFactory接口,无需关心具体配置细节:
// 根据场景选择对应的工厂
GameGUIFactory factory = new SimpleGUIFactory();
GameGUI gameGUI = factory.createGameGUI();
// 直接使用配置完成的GUI
gameGUI.render();

为什么这是正确的做法

  • 彻底摆脱了「为配置而继承」的不良设计,用组合+工厂替代继承,降低了类之间的耦合度。
  • 每个具体工厂只负责一种GUI的配置,完全符合单一职责原则,不会出现一个工厂创建多种GUI的问题。
  • 扩展新的GUI配置时,只需要新增工厂类即可,无需修改现有GameGUI或其他工厂代码,符合开闭原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:22:46