MST

星途 面试题库

面试题:Java工厂模式结合反射在复杂业务场景下的应用设计

假设你正在开发一个大型的电商系统,其中涉及多种类型的订单(如普通订单、团购订单、限时抢购订单等),每个订单类型都有不同的处理逻辑。请设计一个基于Java工厂模式结合反射机制的架构,实现订单处理对象的动态创建,并且要考虑到系统的扩展性、灵活性以及代码的可维护性,详细阐述设计思路和关键代码结构。
30.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义订单接口:创建一个通用的订单接口,所有具体订单类型都实现该接口,以确保不同订单类型具有统一的处理方法。
  2. 创建具体订单类:针对每种订单类型(普通订单、团购订单、限时抢购订单等),创建具体的实现类,实现订单接口中定义的处理逻辑。
  3. 使用工厂模式:构建一个订单工厂类,负责根据订单类型创建相应的订单处理对象。
  4. 结合反射机制:利用反射机制,通过配置文件或其他方式动态获取具体订单类的全限定名,从而实现订单处理对象的动态创建,提高系统的扩展性和灵活性。

关键代码结构

  1. 订单接口
public interface Order {
    void process();
}
  1. 具体订单类
  • 普通订单
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.");
    }
}
  1. 订单工厂类
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);
        }
    }
}
  1. 使用示例
public class Main {
    public static void main(String[] args) {
        String orderType = "normal";
        Order order = OrderFactory.createOrder(orderType);
        order.process();
    }
}

通过这种架构,当需要添加新的订单类型时,只需创建新的订单实现类,在配置中注册该类型,工厂即可通过反射动态创建新类型的订单处理对象,无需修改大量现有代码,提高了系统的扩展性、灵活性和可维护性。