设计模式之工厂方法模式

一、工厂方法模式介绍

1、工厂方法模式是一种创建型设计模式,它提供了一种将对象的创建委托给子类的方式,工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪个类。这样可以将对象的创建逻辑和使用逻辑解耦,使得系统更加灵活。

2、工厂方法模式的核心思想是将对象的创建和使用解耦,通过将对象的创建交给子类来实现,子类可以根据需要自行选择实例化哪个类。工厂方法模式是一种面向对象的思想,它遵循了开闭原则,即对扩展开放,对修改关闭。

3、工厂方法模式的角色:

  • 抽象产品(Product):定义了产品的接口,是具体产品类的父类。
  • 具体产品(Concrete Product):实现抽象产品接口,定义具体产品的具体属性和行为。
  • 抽象工厂(Creator):定义了创建产品的接口,包含一个创建产品的方法。
  • 具体工厂(Concrete Creator):实现抽象工厂接口,实现创建产品的具体逻辑。

4、工厂方法模式的使用场景:

  • 当一个类不知道它所需要的对象的类时。
  • 当一个类希望由子类来指定所创建的对象时。
  • 当一个类将创建对象的职责委托给多个工厂类中的某一个时。

二、下面是一个简单的工厂方法模式的代码示例:

java 复制代码
// 定义产品接口
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");
    }
}

// 定义工厂接口
interface Factory {
    Product createProduct();
}

// 具体工厂A
class ConcreteFactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

// 具体工厂B
class ConcreteFactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建工厂A
        Factory factoryA = new ConcreteFactoryA();
        // 通过工厂A创建产品A
        Product productA = factoryA.createProduct();
        productA.use();

        // 创建工厂B
        Factory factoryB = new ConcreteFactoryB();
        // 通过工厂B创建产品B
        Product productB = factoryB.createProduct();
        productB.use();
    }
}

代码详解:

1、以上代码中,Product是产品接口,定义了产品的抽象方法use。ConcreteProductA和ConcreteProductB是具体产品类,实现了产品接口。

2、Factory是工厂接口,定义了创建产品的抽象方法createProduct。ConcreteFactoryA和ConcreteFactoryB是具体工厂类,实现了工厂接口,通过工厂方法createProduct创建具体产品。

3、在客户端中,首先创建工厂A,通过工厂A创建产品A,并调用产品A的方法。然后创建工厂B,通过工厂B创建产品B,并调用产品B的方法。这样,客户端与具体产品和工厂的实现解耦,并且可以灵活地替换具体产品和工厂。

三、总结

  • 工厂方法模式是一种将对象的创建和使用解耦的设计模式,它将对象的创建交给子类来实现,从而使得系统更加灵活。工厂方法模式适用于当一个类不知道它所需要的对象的类、希望由子类来指定所创建的对象、或将创建对象的职责委托给多个工厂类中的某一个的情况。

  • 抽象工厂模式(Abstract Factory Pattern)和工厂方法模式(Factory Method Pattern)是两种常见的创建型设计模式,它们有以下不同之处:

  1. 抽象工厂模式关注于一系列相关的产品对象的创建,而工厂方法模式关注于单个产品对象的创建。
  2. 抽象工厂模式通过提供一个抽象工厂类和多个具体工厂类来创建一系列产品对象,每个工厂类负责创建一类产品对象。工厂方法模式通过提供一个抽象工厂类和多个具体工厂类来创建特定的产品对象,每个具体工厂类负责创建一种产品对象。
  3. 抽象工厂模式适用于需要创建一系列相关或相互依赖的产品对象的场景,它能够保证创建的产品对象之间的兼容性。工厂方法模式适用于只需要创建单个产品对象的场景,它可以根据具体的工厂类决定创建的产品对象的类型。
  4. 抽象工厂模式增加新的产品对象需要修改抽象工厂类和所有的具体工厂类,违反了开闭原则。工厂方法模式增加新的产品对象只需要添加新的具体工厂类,符合开闭原则。
  5. 抽象工厂模式强调产品对象之间的兼容性和约束性,工厂方法模式强调对产品对象的封装和隐藏。

综上所述,抽象工厂模式和工厂方法模式在对象创建的方式和适用场景上有所差异。具体选择哪种模式取决于需求和设计目标。

如有不足,欢迎指出,期待和大家共同进步---------------------------------------------------------------------------------------------------

相关推荐
zfoo-framework1 小时前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java
逍遥德1 小时前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD2 小时前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
weixin_523185322 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
点燃大海2 小时前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran2 小时前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring
黑马师兄2 小时前
RAG混合检索深度解析:让AI真正找到你要的内容
java·人工智能·ai·agent·rag·ai-native
码客日记2 小时前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git
凡人叶枫3 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
极客先躯3 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷