Java面试必备:简单工厂模式的工作原理

Java面试题 - 请描述简单工厂模式的工作原理。

回答重点

简单工厂模式(SimpleFactoryPattern)不属于GoF23种经典设计模式之一,但是在实际开发中非常常见,它的作用是利用一个工厂作为入口,将多个对象的创建和使用分离。它根据传入的参数来创建并返回不同类型的对象实例。

来看下具体的代码实现就很清晰了:

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

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

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

// 简单工厂类
public class SimpleFactory {
    public static Product createProduct(String type) {
        switch (type) {
            case "A":
                return new ConcreteProductA();
            case "B":
                return new ConcreteProductB();
            default:
                throw new IllegalArgumentException("Unknown product type");
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Product productA = SimpleFactory.createProduct("A");
        productA.use(); // Output: Using ConcreteProductA

        Product productB = SimpleFactory.createProduct("B");
        productB.use(); // Output: Using ConcreteProductB
    }
}

它的优点:

  • 将对象的创建集中在工厂类中,便于管理和维护
  • 屏蔽了底层的创建细节,对使用者来说更方便

缺点:

  • 如果一个工厂类集中所有产品的创建逻辑,那么职责过重,不符合单一职责原则
  • 新增一个产品类型,工厂类都需要被修改,不符合开闭原则

什么是简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在简单工厂模式中,我们创建一个工厂类,它根据传入的参数决定创建并返回哪一种产品类的实例。

简单工厂模式并不是GoF(四人帮)定义的23种设计模式之一,但它作为一种编程习惯被广泛使用,是工厂模式家族中最简单的一种形式。

工作原理

简单工厂模式的核心思想是将对象的创建过程封装在一个工厂类中,客户端不需要知道具体的创建细节,只需要告诉工厂类需要什么类型的对象即可。

Client
Factory
+createProduct(type)
«interface»
Product
+operation()
ConcreteProductA
ConcreteProductB

上面的类图展示了简单工厂模式的基本结构:

  1. Client(客户端): 使用工厂类创建产品对象
  2. Factory(工厂类): 负责创建具体产品对象的类
  3. Product(产品接口): 定义产品的公共接口
  4. ConcreteProduct(具体产品): 实现产品接口的具体类

工作流程

Client Factory Product ConcreteProductA ConcreteProductB 请求创建产品(参数) 创建实例 返回实例 创建实例 返回实例 alt [参数匹配产品A] [参数匹配产品B] 返回产品实例 调用操作方法 Client Factory Product ConcreteProductA ConcreteProductB

工作流程说明:

  1. 客户端向工厂类发送请求,附带创建参数
  2. 工厂类根据参数判断应该创建哪种产品
  3. 工厂类创建具体产品实例
  4. 工厂类将产品实例返回给客户端
  5. 客户端通过产品接口使用产品功能

代码示例

以下是一个简单的Java实现示例:

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

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

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

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

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

优缺点分析

优点

  1. 封装创建逻辑:将对象的创建过程集中管理,客户端无需关心创建细节
  2. 解耦:客户端与具体产品类解耦,只依赖产品接口和工厂类
  3. 易于扩展:添加新产品只需修改工厂类,不需要修改客户端代码(符合开闭原则)

缺点

  1. 工厂类职责过重:所有产品创建逻辑集中在一个工厂类中
  2. 违反开闭原则:添加新产品需要修改工厂类代码
  3. 难以扩展复杂层次结构:不适合产品类层次复杂或需要定制化创建过程的场景

适用场景

简单工厂模式适用于以下场景:

  1. 需要创建的对象较少且不经常变化
  2. 客户端不关心对象的创建过程,只需要获取产品实例
  3. 需要集中管理对象的创建逻辑
  4. 作为其他更复杂工厂模式的基础

总结

简单工厂模式通过将对象的创建过程封装在一个专门的工厂类中,实现了创建逻辑与使用逻辑的分离。虽然它有一些局限性,但在适当的场景下,简单工厂模式能够有效地简化代码结构,提高系统的可维护性和灵活性。

当系统需要更灵活的对象创建机制时,可以考虑使用工厂方法模式或抽象工厂模式等更高级的创建型模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值