当前位置: 首页 > news >正文

23种设计模式-工厂方法(Factory Method)设计模式

工厂方法设计模式

  • 🚩什么是工厂方法设计模式?
  • 🚩工厂方法模式的特点
  • 🚩工厂方法模式的结构
  • 🚩工厂方法模式的优缺点
  • 🚩抽象工厂模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是工厂方法设计模式?

工厂方法设计模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但将具体的实例化过程延迟到子类中。工厂方法模式通过让子类决定实例化哪个类,来解耦对象的创建与使用。这种模式的核心思想是将对象的创建过程封装在工厂方法中,客户端只需要依赖抽象接口,而不需要关心具体的实现类。

工厂方法模式是抽象工厂模式的基础,它适用于需要创建单一对象的场景,而抽象工厂模式则适用于创建一系列相关对象的场景。

🚩工厂方法模式的特点

  • 解耦:工厂方法模式将对象的创建与使用分离,客户端只需要依赖抽象接口,而不需要知道具体的实现类。

  • 扩展性:当需要增加新的产品时,只需增加新的工厂子类和产品子类,符合开闭原则。

  • 单一职责:每个工厂类只负责创建一种产品,符合单一职责原则。

  • 灵活性:工厂方法模式可以根据不同的条件或配置创建不同的对象,增强了系统的灵活性。

🚩工厂方法模式的结构

抽象工厂模式通常包含以下几个角色:

  • 抽象产品(Product):定义产品的接口,是所有具体产品的父类或接口。

  • 具体产品(Concrete Product):实现抽象产品接口,是工厂方法创建的具体对象。

  • 抽象工厂(Creator):定义工厂方法接口,返回抽象产品类型的对象。

  • 具体工厂(Concrete Creator):实现抽象工厂接口,负责创建具体的产品对象。

🚩工厂方法模式的优缺点

优点:

  • 解耦:客户端代码与具体产品类解耦,客户端只需要依赖抽象接口。

  • 扩展性:增加新的产品时,只需增加新的工厂子类和产品子类,无需修改现有代码。

  • 单一职责:每个工厂类只负责创建一种产品,职责清晰。

缺点:

  • 类的数量增加:每增加一个产品,就需要增加一个工厂类,可能会导致类的数量过多。

  • 复杂性增加:对于简单的对象创建场景,使用工厂方法模式可能会增加不必要的复杂性。

🚩抽象工厂模式的Java实现

代码地址:GitHub

  1. 首先定义抽象产品(Product),此处用抽象类也可以,打开注释代码,里面有info方法
/**
 * @author hanson.huang
 * @version V1.0
 * @InterfaceName Product
 * @Description 抽象产品
 * @date 2025/3/21 16:59
 **/
//public abstract class Product {
public interface Product {

//    public abstract void info();
    public void info();
}
  1. 定义抽象工厂(Creator),用于创建产品
/**
 * @author hanson.huang
 * @version V1.0
 * @InterfaceName Factory
 * @Description 工厂接口
 * @date 2025/3/21 16:58
 **/
public interface Factory {

    public Product createProduct();
}

  1. 现在创建具体产品(Concrete Product),实现产品接口或者继承抽象产品类,重写info方法
  • ProductA
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName ProductA
 * @Description 产品实现类A
 * @date 2025/3/21 17:01
 **/
//public class ProductA extends Product{
public class ProductA implements Product{

    @Override
    public void info() {
        System.out.println("产品的信息:A");
    }
}

ProductB

/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName ProductB
 * @Description 产品实现类B
 * @date 2025/3/21 17:01
 **/
//public class ProductB extends Product {
public class ProductB implements Product {

    @Override
    public void info() {
        System.out.println("产品的信息:B");
    }
}
  1. 创建具体工厂(Concrete Creator)来去实现抽象工厂接口,负责创建具体的对象,现在让工厂A创建产品A,让工厂B创建产品B
  • FactoryA
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName FactoryA
 * @Description 工厂A
 * @date 2025/3/21 17:01
 **/
public class FactoryA implements Factory{

    @Override
    public Product createProduct() {
        return new ProductA();
    }
}
  • FactoryB
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName FactoryB
 * @Description 工厂B
 * @date 2025/3/21 17:01
 **/
public class FactoryB implements Factory {

    @Override
    public Product createProduct() {
        return new ProductB();
    }
}
  1. 客户端调用
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName FactoryMethod
 * @Description FactoryMethod Main
 * @date 2025/3/21 16:56
 **/
public class FactoryMethod {
    public static void main(String[] args) {

        // 父类 对象名 = new 子类();
        Factory factoryA = new FactoryA();

        Product productA = factoryA.createProduct();
//         Product productA = new ProductA();
        productA.info();

        Factory factoryB = new FactoryB();
        Product productB = factoryB.createProduct();
        productB.info();
    }
}

在这里插入图片描述

🚩代码总结

在这个示例中,我们定义了一个抽象产品接口 Product,并实现了两种具体产品:ProductAProductB。然后,我们定义了一个抽象工厂接口 Factory,并实现了两个具体工厂类:FactoryAFactoryB,分别用于创建ProductA和ProductB。客户端代码通过调用工厂方法来创建具体的产品对象,而无需关心具体的实现细节。

🚩总结

工厂方法设计模式是一种简单而强大的创建型设计模式,它通过将对象的创建过程延迟到子类中,实现了对象创建与使用的解耦。工厂方法模式适用于需要创建单一对象的场景,尤其是在需要扩展新产品时,能够很好地支持开闭原则。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

相关文章:

  • ccfcsp2701如此编码
  • 统一开放世界与开放词汇检测:YOLO-UniOW无需增量学习的高效通用开放世界目标检测框架
  • 【机密计算顶会解读】11:ACAI——使用 Arm 机密计算架构保护加速器执行
  • FPGA中串行执行方式之计数器控制
  • snmp/mib采用子代理模式,编码,部署
  • 手抖的预防策略
  • 【USTC 计算机网络】第二章:应用层 - TCP UDP 套接字编程
  • [unity 组件] Content Size Fitter 横向填充不满解决办法
  • Json的应用实例——cad 二次开发c#
  • 从零开始学可靠消息投递:分布式事务的“最终一致性”方案
  • 独立组网和非独立组网
  • 文章防洗稿隐蔽混淆软件
  • 102.在Vue3中使用OpenLayers实现定位动画(平移-弹性平移-飞行)
  • 梦回杭州...
  • 【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现全局状态管理
  • 打造更高效的移动远控方案,贝锐向日葵Android主控SDK更新
  • Mac - Cursor 配置 + GPT 4.0/4.5/o1/o3/Deepseek Api 使用
  • 数据结构——第六章:图
  • 力扣算法Hot100——128. 最长连续序列
  • C# WPF编程-TabControl
  • 李伟任山东省委常委、省纪委书记
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯被执行死刑
  • 通往国际舞台之路:清政府与万国公会的交往
  • 讲座预告|以危机为视角解读全球治理
  • 共建医学人工智能高地,上海卫健委与徐汇区将在这些方面合作
  • 为什么越来越多景区,把C位留给了书店?