MST
星途 面试题库

面试题:Java中工厂模式的反模式分析

在Java开发中,工厂模式被广泛应用来创建对象。然而,有些实现方式可能会导致反模式。请举例说明工厂模式可能出现的反模式,比如过度复杂的工厂逻辑或者与业务逻辑耦合过深,并阐述如何重构以避免这些问题。
14.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

工厂模式可能出现的反模式

  1. 过度复杂的工厂逻辑
    • 举例:在一个简单的图形绘制系统中,原本只需要创建圆形、方形等基本图形。但工厂类中包含了大量复杂的条件判断逻辑,比如根据不同的操作系统、用户权限、屏幕分辨率等多种因素来决定创建何种图形。这些条件判断交织在一起,使得工厂类代码冗长且难以维护。
    • 问题:代码可读性差,维护成本高,增加新的图形类型或修改创建逻辑时,需要在复杂的条件判断中进行改动,容易引入新的错误。
  2. 与业务逻辑耦合过深
    • 举例:假设在一个电商系统中,订单创建工厂类不仅负责创建订单对象,还包含了判断订单是否符合促销规则、计算订单优惠金额等业务逻辑。当促销规则发生变化时,不仅订单业务类需要修改,工厂类也必须跟着修改。
    • 问题:违反了单一职责原则,工厂类承担了过多职责,导致代码的可维护性和可扩展性降低。当业务逻辑发生变化时,会影响到工厂类的稳定性,同时也不利于代码的复用。

重构方法

  1. 针对过度复杂的工厂逻辑
    • 策略:将复杂的条件判断逻辑进行拆分和简化。可以采用策略模式,将不同的创建逻辑封装成独立的策略类,工厂类根据条件选择合适的策略来创建对象。
    • 示例代码
// 定义图形接口
interface Shape {
    void draw();
}

// 圆形实现
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

// 方形实现
class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a square");
    }
}

// 创建图形的策略接口
interface ShapeCreationStrategy {
    Shape createShape();
}

// 圆形创建策略
class CircleCreationStrategy implements ShapeCreationStrategy {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

// 方形创建策略
class SquareCreationStrategy implements ShapeCreationStrategy {
    @Override
    public Shape createShape() {
        return new Square();
    }
}

// 图形工厂类
class ShapeFactory {
    private ShapeCreationStrategy strategy;

    public ShapeFactory(ShapeCreationStrategy strategy) {
        this.strategy = strategy;
    }

    public Shape createShape() {
        return strategy.createShape();
    }
}
- **使用示例**:
public class Main {
    public static void main(String[] args) {
        ShapeCreationStrategy circleStrategy = new CircleCreationStrategy();
        ShapeFactory circleFactory = new ShapeFactory(circleStrategy);
        Shape circle = circleFactory.createShape();
        circle.draw();

        ShapeCreationStrategy squareStrategy = new SquareCreationStrategy();
        ShapeFactory squareFactory = new ShapeFactory(squareStrategy);
        Shape square = squareFactory.createShape();
        square.draw();
    }
}
  1. 针对与业务逻辑耦合过深
    • 策略:将业务逻辑从工厂类中分离出来,使工厂类只专注于对象的创建。业务逻辑可以放到专门的业务服务类中进行处理。
    • 示例代码
// 订单类
class Order {
    private double amount;
    // 其他订单属性和方法

    public Order(double amount) {
        this.amount = amount;
    }

    public double getAmount() {
        return amount;
    }
}

// 订单创建工厂类
class OrderFactory {
    public Order createOrder(double amount) {
        return new Order(amount);
    }
}

// 订单业务服务类
class OrderService {
    public double calculateDiscount(Order order) {
        // 这里实现具体的折扣计算逻辑
        if (order.getAmount() > 100) {
            return order.getAmount() * 0.1;
        }
        return 0;
    }
}
- **使用示例**:
public class Main {
    public static void main(String[] args) {
        OrderFactory orderFactory = new OrderFactory();
        Order order = orderFactory.createOrder(150);

        OrderService orderService = new OrderService();
        double discount = orderService.calculateDiscount(order);
        System.out.println("Discount: " + discount);
    }
}

通过以上重构方法,可以有效避免工厂模式中出现的反模式,提高代码的可维护性、可扩展性和复用性。