MST

星途 面试题库

面试题:Java抽象工厂模式在复杂项目中的应用

假设你正在开发一个跨平台的游戏引擎,该引擎需要创建不同平台(如Windows、Linux、Android、iOS)的图形渲染器、输入管理器等组件。请使用Java抽象工厂模式设计该游戏引擎的组件创建框架,描述设计思路并给出关键代码片段。
18.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义抽象工厂接口:创建一个抽象工厂接口,它定义了创建不同平台组件的方法,如创建图形渲染器和输入管理器。
  2. 实现具体工厂类:针对每个平台(Windows、Linux、Android、iOS)创建具体的工厂类,这些类实现抽象工厂接口,负责创建对应平台的具体组件。
  3. 定义抽象产品接口:为图形渲染器和输入管理器分别定义抽象接口,作为不同平台具体组件的共性抽象。
  4. 实现具体产品类:针对每个平台,实现符合抽象产品接口的具体图形渲染器和输入管理器类。

关键代码片段

  1. 抽象工厂接口
public interface GameEngineComponentFactory {
    GraphicsRenderer createGraphicsRenderer();
    InputManager createInputManager();
}
  1. 抽象产品接口 - 图形渲染器
public interface GraphicsRenderer {
    void render();
}
  1. 抽象产品接口 - 输入管理器
public interface InputManager {
    void handleInput();
}
  1. 具体工厂类 - Windows平台
public class WindowsGameEngineComponentFactory implements GameEngineComponentFactory {
    @Override
    public GraphicsRenderer createGraphicsRenderer() {
        return new WindowsGraphicsRenderer();
    }

    @Override
    public InputManager createInputManager() {
        return new WindowsInputManager();
    }
}
  1. 具体产品类 - Windows图形渲染器
public class WindowsGraphicsRenderer implements GraphicsRenderer {
    @Override
    public void render() {
        System.out.println("Windows Graphics Renderer is rendering.");
    }
}
  1. 具体产品类 - Windows输入管理器
public class WindowsInputManager implements InputManager {
    @Override
    public void handleInput() {
        System.out.println("Windows Input Manager is handling input.");
    }
}
  1. 使用抽象工厂
public class GameEngine {
    private GraphicsRenderer renderer;
    private InputManager inputManager;

    public GameEngine(GameEngineComponentFactory factory) {
        this.renderer = factory.createGraphicsRenderer();
        this.inputManager = factory.createInputManager();
    }

    public void start() {
        renderer.render();
        inputManager.handleInput();
    }
}
  1. 测试代码
public class Main {
    public static void main(String[] args) {
        GameEngineComponentFactory factory = new WindowsGameEngineComponentFactory();
        GameEngine gameEngine = new GameEngine(factory);
        gameEngine.start();
    }
}