MST

星途 面试题库

面试题:Java抽象工厂模式在跨平台UI开发中的应用

假设要开发一个跨平台(Windows、Linux、Mac)的图形界面应用,使用Java抽象工厂模式设计一个框架,用于创建不同平台下的按钮、文本框等UI组件,阐述设计思路并给出关键代码片段。
21.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义抽象产品类:为按钮、文本框等UI组件定义抽象类,各平台具体的组件类继承自这些抽象类。
  2. 定义抽象工厂类:创建一个抽象工厂类,声明创建不同UI组件的抽象方法。
  3. 创建具体工厂类:针对每个平台(Windows、Linux、Mac)创建具体的工厂类,实现抽象工厂类中的方法,返回对应平台的具体UI组件对象。
  4. 客户端使用:客户端通过抽象工厂类获取不同平台的UI组件,而无需关心具体的平台实现。

关键代码片段

  1. 抽象产品类 - 按钮
public abstract class Button {
    public abstract void paint();
}
  1. 抽象产品类 - 文本框
public abstract class TextBox {
    public abstract void paint();
}
  1. 抽象工厂类
public abstract class GUIFactory {
    public abstract Button createButton();
    public abstract TextBox createTextBox();
}
  1. Windows平台具体工厂类
public class WindowsGUIFactory extends GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public TextBox createTextBox() {
        return new WindowsTextBox();
    }
}
  1. Windows平台具体按钮类
public class WindowsButton extends Button {
    @Override
    public void paint() {
        System.out.println("绘制Windows风格按钮");
    }
}
  1. Windows平台具体文本框类
public class WindowsTextBox extends TextBox {
    @Override
    public void paint() {
        System.out.println("绘制Windows风格文本框");
    }
}
  1. Linux平台具体工厂类
public class LinuxGUIFactory extends GUIFactory {
    @Override
    public Button createButton() {
        return new LinuxButton();
    }

    @Override
    public TextBox createTextBox() {
        return new LinuxTextBox();
    }
}
  1. Linux平台具体按钮类
public class LinuxButton extends Button {
    @Override
    public void paint() {
        System.out.println("绘制Linux风格按钮");
    }
}
  1. Linux平台具体文本框类
public class LinuxTextBox extends TextBox {
    @Override
    public void paint() {
        System.out.println("绘制Linux风格文本框");
    }
}
  1. Mac平台具体工厂类
public class MacGUIFactory extends GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public TextBox createTextBox() {
        return new MacTextBox();
    }
}
  1. Mac平台具体按钮类
public class MacButton extends Button {
    @Override
    public void paint() {
        System.out.println("绘制Mac风格按钮");
    }
}
  1. Mac平台具体文本框类
public class MacTextBox extends TextBox {
    @Override
    public void paint() {
        System.out.println("绘制Mac风格文本框");
    }
}
  1. 客户端代码
public class Application {
    private Button button;
    private TextBox textBox;

    public Application(GUIFactory factory) {
        button = factory.createButton();
        textBox = factory.createTextBox();
    }

    public void paint() {
        button.paint();
        textBox.paint();
    }
}

使用示例:

public class Main {
    public static void main(String[] args) {
        // 使用Windows平台的工厂
        GUIFactory windowsFactory = new WindowsGUIFactory();
        Application windowsApp = new Application(windowsFactory);
        windowsApp.paint();

        // 使用Linux平台的工厂
        GUIFactory linuxFactory = new LinuxGUIFactory();
        Application linuxApp = new Application(linuxFactory);
        linuxApp.paint();

        // 使用Mac平台的工厂
        GUIFactory macFactory = new MacGUIFactory();
        Application macApp = new Application(macFactory);
        macApp.paint();
    }
}