面试题答案
一键面试工厂模式可能出现的反模式
- 过度复杂的工厂逻辑
- 举例:在一个简单的图形绘制系统中,原本只需要创建圆形、方形等基本图形。但工厂类中包含了大量复杂的条件判断逻辑,比如根据不同的操作系统、用户权限、屏幕分辨率等多种因素来决定创建何种图形。这些条件判断交织在一起,使得工厂类代码冗长且难以维护。
- 问题:代码可读性差,维护成本高,增加新的图形类型或修改创建逻辑时,需要在复杂的条件判断中进行改动,容易引入新的错误。
- 与业务逻辑耦合过深
- 举例:假设在一个电商系统中,订单创建工厂类不仅负责创建订单对象,还包含了判断订单是否符合促销规则、计算订单优惠金额等业务逻辑。当促销规则发生变化时,不仅订单业务类需要修改,工厂类也必须跟着修改。
- 问题:违反了单一职责原则,工厂类承担了过多职责,导致代码的可维护性和可扩展性降低。当业务逻辑发生变化时,会影响到工厂类的稳定性,同时也不利于代码的复用。
重构方法
- 针对过度复杂的工厂逻辑
- 策略:将复杂的条件判断逻辑进行拆分和简化。可以采用策略模式,将不同的创建逻辑封装成独立的策略类,工厂类根据条件选择合适的策略来创建对象。
- 示例代码:
// 定义图形接口
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();
}
}
- 针对与业务逻辑耦合过深
- 策略:将业务逻辑从工厂类中分离出来,使工厂类只专注于对象的创建。业务逻辑可以放到专门的业务服务类中进行处理。
- 示例代码:
// 订单类
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);
}
}
通过以上重构方法,可以有效避免工厂模式中出现的反模式,提高代码的可维护性、可扩展性和复用性。