MST

星途 面试题库

面试题:Java常用设计模式之工厂模式

请简述Java中工厂模式的概念,并说明简单工厂、工厂方法和抽象工厂这三种工厂模式之间的区别与联系,同时用Java代码实现一个简单工厂模式的示例。
14.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

工厂模式概念

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离。通过使用工厂模式,可以将对象创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样使得代码更易于维护、扩展和复用。

三种工厂模式的区别与联系

  1. 简单工厂:简单工厂不是一种真正的设计模式,而是一种编程习惯。它定义了一个工厂类,用于创建产品对象。工厂类有一个创建产品的方法,该方法根据传入的参数决定创建哪种具体产品。简单工厂模式的优点是实现简单,缺点是不符合开闭原则,当需要新增产品时,需要修改工厂类的代码。
  2. 工厂方法:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。它符合开闭原则,新增产品时只需要新增具体产品类和对应的工厂子类,不需要修改原有工厂类代码。但是工厂方法模式会导致工厂子类过多,增加系统复杂度。
  3. 抽象工厂:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式将对象的创建进一步抽象化,客户端只需要调用抽象工厂的抽象创建方法,具体创建逻辑由具体的抽象工厂子类实现。抽象工厂模式适用于创建对象家族的场景,缺点是实现复杂,当新增产品族时,需要修改抽象工厂接口及其所有子类。

三者联系在于都属于工厂模式,都将对象创建和使用分离。简单工厂是基础,工厂方法在简单工厂基础上通过引入抽象层和多态性解决了不符合开闭原则的问题,抽象工厂则进一步扩展,用于创建一系列相关对象。

简单工厂模式示例代码

// 产品接口
interface Product {
    void use();
}

// 具体产品A
class ConcreteProductA implements Product {
    @Override
    public void use() {
        System.out.println("使用具体产品A");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    @Override
    public void use() {
        System.out.println("使用具体产品B");
    }
}

// 简单工厂类
class SimpleFactory {
    public Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ConcreteProductA();
        } else if ("B".equals(type)) {
            return new ConcreteProductB();
        }
        return null;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        Product productA = factory.createProduct("A");
        Product productB = factory.createProduct("B");
        if (productA != null) {
            productA.use();
        }
        if (productB != null) {
            productB.use();
        }
    }
}