面试题答案
一键面试Java工厂方法模式核心概念
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。其核心在于将对象的创建和使用分离,通过一个抽象的工厂类定义创建对象的抽象方法,具体的对象创建由其子类实现。这样,当需要创建新的对象类型时,只需新增一个具体的工厂子类,而不需要修改原有代码,符合开闭原则。
相较于简单工厂模式在插件化系统中的优势
- 可扩展性更强:简单工厂模式将所有对象创建逻辑集中在一个工厂类中,当新增插件类型时,需要修改该工厂类的代码。而工厂方法模式通过让每个具体工厂负责创建一种特定类型的插件,新增插件类型只需新增对应的具体工厂子类,无需修改原有工厂类代码。
- 符合开闭原则:工厂方法模式在添加新的插件类型时,只需要扩展新的具体工厂类和对应的插件类,对原有代码无侵入性。而简单工厂模式添加新插件类型时,要修改工厂类的创建逻辑,违反开闭原则。
代码示例
- 定义插件接口
public interface Plugin {
void execute();
}
- 定义具体插件类
public class PluginA implements Plugin {
@Override
public void execute() {
System.out.println("PluginA is executing.");
}
}
public class PluginB implements Plugin {
@Override
public void execute() {
System.out.println("PluginB is executing.");
}
}
- 定义抽象工厂类
public abstract class PluginFactory {
public abstract Plugin createPlugin();
}
- 定义具体工厂类
public class PluginAFactory extends PluginFactory {
@Override
public Plugin createPlugin() {
return new PluginA();
}
}
public class PluginBFactory extends PluginFactory {
@Override
public Plugin createPlugin() {
return new PluginB();
}
}
- 使用工厂方法模式加载插件
public class Main {
public static void main(String[] args) {
PluginFactory pluginAFactory = new PluginAFactory();
Plugin pluginA = pluginAFactory.createPlugin();
pluginA.execute();
PluginFactory pluginBFactory = new PluginBFactory();
Plugin pluginB = pluginBFactory.createPlugin();
pluginB.execute();
}
}
在上述代码中,通过抽象工厂类PluginFactory
定义创建插件的抽象方法createPlugin
,具体的工厂类PluginAFactory
和PluginBFactory
分别负责创建PluginA
和PluginB
。在main
方法中,通过具体工厂类创建对应的插件实例并执行,实现了插件的加载。