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

抽象工厂模式和工厂模式的区别

1. 工厂模式(Factory Method Pattern)
工厂模式是为创建对象提供一个接口,让子类决定实例化哪一个类。工厂模式通过将实例化的过程延迟到子类,从而实现对象创建的灵活性。

  • 核心思想:定义一个创建对象的接口,但由子类来具体决定要实例化哪一个类。
  • 特点:关注的是“创建某一种类的对象”,它解决的是不同子类中如何实例化对象的细节问题。
结构:
  • 抽象工厂类:声明创建产品的方法。
  • 具体工厂类:实现创建产品的方法。
  • 产品接口:定义产品的共同接口。
  • 具体产品类:实现产品接口的具体类。
示例:
// 产品接口
interface Product {
    void use();
}

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

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

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

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

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

在工厂模式中,每个具体工厂负责生产一种具体产品。你可以通过选择不同的工厂来创建不同的产品。


2. 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式是一种更复杂的设计模式,它允许你创建一组相关的对象,而不是单个对象。抽象工厂提供一个接口,能够创建一系列相关或依赖的对象,而无需指定它们的具体类。

  • 核心思想:提供一个创建一组相关或相互依赖对象的接口,而无需指定具体类。
  • 特点:不仅能创建一个产品,还能创建一组产品,这组产品通常有某种关联或依赖关系
结构:
  • 抽象工厂接口:定义创建一组相关对象的方法。
  • 具体工厂类:实现创建具体产品的方法。
  • 抽象产品接口:为每个产品类提供接口。
  • 具体产品类:实现抽象产品接口的具体类。
示例:
// 抽象产品A接口
interface ProductA {
    void use();
}

// 抽象产品B接口
interface ProductB {
    void consume();
}

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

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

// 具体产品B1
class ConcreteProductB1 implements ProductB {
    @Override
    public void consume() {
        System.out.println("Consuming Product B1");
    }
}

// 具体产品B2
class ConcreteProductB2 implements ProductB {
    @Override
    public void consume() {
        System.out.println("Consuming Product B2");
    }
}

// 抽象工厂接口
interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB1();
    }
}

// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB2();
    }
}

在抽象工厂模式中,每个具体工厂负责生产一系列相关的产品(如 ProductAProductB),而不仅仅是单一的产品。


应用场景的不同

工厂模式的应用场景:
  • 当你只需要创建某一种产品的实例,而不需要创建其他类型的相关产品时。
  • 你希望由子类来决定实例化哪个具体产品。
  • 适合简单场景,如根据用户输入或配置文件决定创建哪种产品。
例子:
  • 文件解析器:根据文件类型(如 .txt, .pdf)来创建不同的解析器对象。
抽象工厂模式的应用场景:
  • 当你需要创建一组相互关联或相互依赖的对象时。
  • 系统的产品不仅仅是一个,而是一族产品,且系统需要避免产品之间的不兼容性。
  • 适合复杂场景,如产品系列需要一起工作或与其他产品协作。
例子:
  • 跨平台 UI 库:不同平台(如 Windows 和 macOS)需要一套相关联的 UI 组件(如按钮、菜单等)。抽象工厂可以为每个平台创建一组相关的 UI 组件。

总结:

  • 工厂模式适用于创建单一产品,关注的是如何创建一个对象。
  • 抽象工厂模式适用于创建一组相关产品,关注的是如何创建多个相关对象并保持其兼容性。

http://www.kler.cn/news/326394.html

相关文章:

  • 使用 IntelliJ IDEA 连接到达梦数据库(DM)
  • 大厂面试真题- RPC通讯协议如何保证数据完整性
  • 谷歌网站收录查询,怎么查看网站在谷歌的收录情况
  • 1. AOSP源码导入到AndroidStudio
  • JWT 令牌生成报错
  • Linux(含麒麟操作系统)如何实现多显示器屏幕采集录制
  • 8.代码风格调试%结课竞赛
  • Ubuntu篇——Ubuntu20.04备份成ISO镜像文件并安装到其他电脑上(完整步骤)
  • 安全无忧,简单便捷:打造财富通开锁小程序
  • 根据现有html里的元素上面动态创建el-tooltip组件并显示的几种方式
  • js中数组操作filter()、some()、every()等函数
  • 五,MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”(详细实操)
  • 360° 镜头检测铝件内壁划痕与杂质:保障铝件内孔制造质量的精准方案
  • Flutter中使用FFI的方式链接C/C++的so库(harmonyos)
  • winform 将untiy程序嵌入到一个panel里
  • oracle 如何获取当前时间的日份,月份,年份
  • 目前最好用的爬虫软件是那个?
  • YOLOv10涨点改进:IoU优化 | Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU
  • 快速学会一个算法,BERT
  • ant-design-vue中table组件复选框分页切换保留之前选中数据
  • 网络工程和信息安全专业应该考哪些证书?
  • Python每次for循环向list中添加多个元素
  • 【echarts】报错series.render is required.
  • 【ZYNQ 开发】填坑!双核数据采集系统LWIP TCP发送,运行一段时间不再发送且无法ping通的问题解决
  • You are not allowed to push code to this project
  • Docker 安装 ClickHouse 教程
  • Composition API 与 React Hook 的区别
  • Java LeetCode每日一题(2024.9.26)
  • Unity开发绘画板——04.笔刷大小调节
  • 智能AI对话绘画二合一网站源码系统 带完整的安装代码包以及搭建部署教程