面试题答案
一键面试设计思路
- 定义抽象产品类:为按钮、文本框等UI组件定义抽象类,各平台具体的组件类继承自这些抽象类。
- 定义抽象工厂类:创建一个抽象工厂类,声明创建不同UI组件的抽象方法。
- 创建具体工厂类:针对每个平台(Windows、Linux、Mac)创建具体的工厂类,实现抽象工厂类中的方法,返回对应平台的具体UI组件对象。
- 客户端使用:客户端通过抽象工厂类获取不同平台的UI组件,而无需关心具体的平台实现。
关键代码片段
- 抽象产品类 - 按钮
public abstract class Button {
public abstract void paint();
}
- 抽象产品类 - 文本框
public abstract class TextBox {
public abstract void paint();
}
- 抽象工厂类
public abstract class GUIFactory {
public abstract Button createButton();
public abstract TextBox createTextBox();
}
- Windows平台具体工厂类
public class WindowsGUIFactory extends GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextBox createTextBox() {
return new WindowsTextBox();
}
}
- Windows平台具体按钮类
public class WindowsButton extends Button {
@Override
public void paint() {
System.out.println("绘制Windows风格按钮");
}
}
- Windows平台具体文本框类
public class WindowsTextBox extends TextBox {
@Override
public void paint() {
System.out.println("绘制Windows风格文本框");
}
}
- Linux平台具体工厂类
public class LinuxGUIFactory extends GUIFactory {
@Override
public Button createButton() {
return new LinuxButton();
}
@Override
public TextBox createTextBox() {
return new LinuxTextBox();
}
}
- Linux平台具体按钮类
public class LinuxButton extends Button {
@Override
public void paint() {
System.out.println("绘制Linux风格按钮");
}
}
- Linux平台具体文本框类
public class LinuxTextBox extends TextBox {
@Override
public void paint() {
System.out.println("绘制Linux风格文本框");
}
}
- Mac平台具体工厂类
public class MacGUIFactory extends GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextBox createTextBox() {
return new MacTextBox();
}
}
- Mac平台具体按钮类
public class MacButton extends Button {
@Override
public void paint() {
System.out.println("绘制Mac风格按钮");
}
}
- Mac平台具体文本框类
public class MacTextBox extends TextBox {
@Override
public void paint() {
System.out.println("绘制Mac风格文本框");
}
}
- 客户端代码
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();
}
}