MST
星途 面试题库

面试题:Java工厂模式中简单工厂与工厂方法模式的区别

请详细阐述在Java中简单工厂模式和工厂方法模式在结构、使用场景、优缺点等方面的区别,并结合代码示例说明。
16.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

结构区别

  1. 简单工厂模式
    • 包含一个工厂类,该工厂类有一个创建产品的静态方法。工厂类负责创建具体的产品对象,客户端只需要调用工厂类的静态方法,并传入相应的参数来获取所需的产品。例如,有一个CarFactory类,它有一个静态方法createCar(String type),根据传入的type参数创建不同类型的Car对象。
    • 结构相对简单,只有一个工厂类来负责所有产品的创建。
  2. 工厂方法模式
    • 有一个抽象的工厂类,定义了创建产品的抽象方法。具体的工厂类继承自抽象工厂类,并实现创建产品的抽象方法。客户端通过调用具体工厂类的方法来获取产品。例如,有一个抽象的CarFactory类,其中有抽象方法createCar(),然后有SedanCarFactorySUVCarFactory等具体工厂类继承CarFactory并实现createCar()方法。
    • 结构比简单工厂模式复杂,引入了抽象工厂类,将工厂的创建逻辑进行了抽象,使得系统更具扩展性。

使用场景区别

  1. 简单工厂模式
    • 适用于产品种类较少且不会频繁增加新产品的场景。例如,一个小型的汽车制造模拟器,只生产轿车和SUV两种车型,使用简单工厂模式就可以方便地创建不同类型的汽车对象。
  2. 工厂方法模式
    • 适用于产品种类较多,且可能会经常增加新产品的场景。例如,一个大型的汽车制造公司,产品线丰富,不断有新的车型推出,使用工厂方法模式可以通过新增具体工厂类来创建新的产品,而不需要修改原有工厂类的代码。

优缺点区别

  1. 简单工厂模式
    • 优点
      • 实现简单,对于客户端来说使用方便,只需要调用工厂类的静态方法即可获取产品。
      • 工厂类封装了产品的创建逻辑,客户端不需要了解产品的具体创建过程。
    • 缺点
      • 不符合开闭原则,如果需要增加新的产品,就需要修改工厂类的代码,在createCar方法中添加新的if - else分支或者switch - case语句,这可能会导致已有代码的风险。
  2. 工厂方法模式
    • 优点
      • 符合开闭原则,当需要增加新的产品时,只需要新增一个具体工厂类并实现抽象工厂类的方法,不需要修改原有代码。
      • 扩展性好,适合复杂多变的产品创建需求。
    • 缺点
      • 相比简单工厂模式,代码结构更加复杂,需要定义抽象工厂类和多个具体工厂类,增加了系统的理解和维护成本。

代码示例

  1. 简单工厂模式代码示例
// 产品接口
interface Car {
    void drive();
}

// 具体产品1
class SedanCar implements Car {
    @Override
    public void drive() {
        System.out.println("Driving a sedan car.");
    }
}

// 具体产品2
class SUVCar implements Car {
    @Override
    public void drive() {
        System.out.println("Driving an SUV car.");
    }
}

// 简单工厂类
class CarFactory {
    public static Car createCar(String type) {
        if ("sedan".equals(type)) {
            return new SedanCar();
        } else if ("suv".equals(type)) {
            return new SUVCar();
        }
        return null;
    }
}

// 客户端代码
public class SimpleFactoryClient {
    public static void main(String[] args) {
        Car sedan = CarFactory.createCar("sedan");
        if (sedan != null) {
            sedan.drive();
        }
        Car suv = CarFactory.createCar("suv");
        if (suv != null) {
            suv.drive();
        }
    }
}
  1. 工厂方法模式代码示例
// 产品接口
interface Car {
    void drive();
}

// 具体产品1
class SedanCar implements Car {
    @Override
    public void drive() {
        System.out.println("Driving a sedan car.");
    }
}

// 具体产品2
class SUVCar implements Car {
    @Override
    public void drive() {
        System.out.println("Driving an SUV car.");
    }
}

// 抽象工厂类
abstract class CarFactory {
    public abstract Car createCar();
}

// 具体工厂类1
class SedanCarFactory extends CarFactory {
    @Override
    public Car createCar() {
        return new SedanCar();
    }
}

// 具体工厂类2
class SUVCarFactory extends CarFactory {
    @Override
    public Car createCar() {
        return new SUVCar();
    }
}

// 客户端代码
public class FactoryMethodClient {
    public static void main(String[] args) {
        CarFactory sedanFactory = new SedanCarFactory();
        Car sedan = sedanFactory.createCar();
        if (sedan != null) {
            sedan.drive();
        }
        CarFactory suvFactory = new SUVCarFactory();
        Car suv = suvFactory.createCar();
        if (suv != null) {
            suv.drive();
        }
    }
}