面试题答案
一键面试设计思路
- 定义订单接口:创建一个通用的订单接口,所有具体订单类型都实现该接口,以确保不同订单类型具有统一的处理方法。
- 创建具体订单类:针对每种订单类型(普通订单、团购订单、限时抢购订单等),创建具体的实现类,实现订单接口中定义的处理逻辑。
- 使用工厂模式:构建一个订单工厂类,负责根据订单类型创建相应的订单处理对象。
- 结合反射机制:利用反射机制,通过配置文件或其他方式动态获取具体订单类的全限定名,从而实现订单处理对象的动态创建,提高系统的扩展性和灵活性。
关键代码结构
- 订单接口:
public interface Order {
void process();
}
- 具体订单类:
- 普通订单:
public class NormalOrder implements Order {
@Override
public void process() {
System.out.println("Processing normal order.");
}
}
- 团购订单:
public class GroupBuyOrder implements Order {
@Override
public void process() {
System.out.println("Processing group buy order.");
}
}
- 限时抢购订单:
public class FlashSaleOrder implements Order {
@Override
public void process() {
System.out.println("Processing flash sale order.");
}
}
- 订单工厂类:
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
public class OrderFactory {
private static final Map<String, Class<? extends Order>> orderTypeMap = new HashMap<>();
static {
// 初始化订单类型映射,可从配置文件读取
orderTypeMap.put("normal", NormalOrder.class);
orderTypeMap.put("groupBuy", GroupBuyOrder.class);
orderTypeMap.put("flashSale", FlashSaleOrder.class);
}
public static Order createOrder(String orderType) {
Class<? extends Order> orderClass = orderTypeMap.get(orderType);
if (orderClass == null) {
throw new IllegalArgumentException("Unsupported order type: " + orderType);
}
try {
Constructor<? extends Order> constructor = orderClass.getConstructor();
return constructor.newInstance();
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException("Failed to create order instance for type: " + orderType, e);
}
}
}
- 使用示例:
public class Main {
public static void main(String[] args) {
String orderType = "normal";
Order order = OrderFactory.createOrder(orderType);
order.process();
}
}
通过这种架构,当需要添加新的订单类型时,只需创建新的订单实现类,在配置中注册该类型,工厂即可通过反射动态创建新类型的订单处理对象,无需修改大量现有代码,提高了系统的扩展性、灵活性和可维护性。