简单工厂、工厂方法与抽象工厂之间的区别

简单工厂、工厂方法与抽象工厂之间的区别

    • 1、简单工厂(Simple Factory)
      • 1.1 定义
      • 1.2 特点
      • 1.3 示例场景
    • 2、工厂方法(Factory Method)
      • 2.1 定义
      • 2.2 特点
      • 2.3 示例场景
    • 3、抽象工厂(Abstract Factory)
      • 3.1 定义
      • 3.2 特点
      • 3.3 示例场景


💖The Begin💖点点关注,收藏不迷路💖

设计模式是解决常见问题的最佳实践。工厂模式系列(简单工厂、工厂方法、抽象工厂)作为创建型设计模式,它们在对象的创建和管理上扮演着重要角色。接下来,我们将深入探讨这三种工厂模式之间的区别。

1、简单工厂(Simple Factory)

1.1 定义

简单工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。通过定义一个工厂类,根据传入的参数或类型信息来创建不同类的实例。

1.2 特点

  • 集中创建逻辑:将所有实例的创建逻辑封装在一个工厂类中。
  • 易于使用:客户端只需传入参数即可获取所需的对象,无需知道对象的创建细节。
  • 扩展性差:当需要增加新的产品时,需要修改工厂类的代码,违反了开闭原则。

1.3 示例场景

  • 简单的日志记录器,根据配置的不同创建不同类型的日志记录器实例。
  • 根据不同的用户类型创建不同的用户对象。

2、工厂方法(Factory Method)

2.1 定义

工厂方法模式是对简单工厂模式的进一步抽象和改进。它定义一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。

2.2 特点

  • 符合开闭原则:当需要增加新的产品时,只需增加新的具体产品类和相应的工厂子类,无需修改原有的工厂接口或工厂类。
  • 解耦:将对象的创建与使用分离,降低了系统的耦合度。
  • 灵活性:可以根据不同的需要创建不同的产品实例。

2.3 示例场景

  • 多种数据库连接对象的创建,每种数据库对应一个工厂子类。
  • 游戏中的不同角色创建,每种角色对应一个工厂子类。

3、抽象工厂(Abstract Factory)

3.1 定义

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

3.2 特点

  • 产品族:抽象工厂模式关注的是产品族(即一组具有相同主题或目的的产品),而不是单个产品。
  • 增加产品族容易:当需要增加新的产品族时,只需增加新的抽象工厂和相应的具体工厂类,原有代码无需修改。
  • 增加新产品难:如果需要在一个产品族中增加新的产品,则需要在所有的具体工厂类中增加相应的创建逻辑,可能会违反开闭原则。

3.3 示例场景

  • 跨平台的UI组件创建,如Windows和Mac平台的按钮、文本框等。
  • 游戏中的不同场景创建,每个场景包含多个相关的游戏对象(如敌人、道具等)。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE-多线程背景-线程等待-线程的六种状态-线程安全问题-详解】

🌈个人主页:SKY-30 ⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 &…

C语言实现冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。 遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元…

数据包的跨层封装

首先,我们先简单地分析一下数据包的组成结构: 如图 数据包简略地分为以下几层: 二层:封装MAC地址(数据链路层) 三层:封装IP地址 — 表明源IP和目标IP,主要用于路由器之间的信息转发…

【人工智能】Transformers之Pipeline(三):文本转音频(text-to-audio/text-to-speech)

​​​​​​​ 一、引言 pipeline(管道)是huggingface transformers库中一种极简方式使用大模型推理的抽象,将所有大模型分为音频(Audio)、计算机视觉(Computer vision)、自然语言处理&#x…

挖矿宝藏之硬盘分区

目录 一、硬盘分区的相关知识 二、主分区、活动分区、扩展分区、逻辑盘和盘符 三、硬盘分区原因 1.减少硬盘空间的浪费 2.便于文件的分类管理 3.有利于病毒的防治 四、硬盘分区的原则 1.方便性 2.实用性 3.安全性 五、利用Diskpart进行分区 1.命令行工具Diskpart …

ARM体系结构和接口技术(五)封装RCC和GPIO库

文章目录 一、RCC(一)思路1. 找到时钟基地址2. 找到总线的地址偏移(1)AHB4总线(2)定义不同GPIO组的使能宏函数(3)APB1总线(4)定义使能宏函数 二、GPIO&#x…

捷配笔记-混合信号PCB布局设计的基本准则是什么?

混合信号PCB设计需要对模拟和数字电路有基本的了解,以最大限度地减少(如果不能防止的话)信号干扰。现代系统由数字域和模拟域均可操作的组件组成,这些组件必须经过精心设计,以确保整个系统的信号完整性。 在混合信号系…

MySQL学习记录 —— 이십이 MySQL服务器文件系统(2)

文章目录 1、日志文件的整体简介2、一般、慢查询日志1、一般查询日志2、慢查询日志FILE格式TABLE格式 3、错误日志4、二进制日志5、日志维护 1、日志文件的整体简介 中继服务器的数据来源于集群中的主服务。每次做一些操作时,把操作保存到重做日志,这样崩…

vscode+wsl2+anaconda环境的配置与使用

目录 下载anaconda Anaconda使用参考 vscodeubuntuanaconda 先用vscode连接本地ubuntu。 如果没有安装wsl2与ubuntu,可点击下面的链接。 问题:wsl install 无法解析服务器 成功记录: 在vscode终端用ubuntu安装anaconda。 创建pytho…

Spring如何管理Mapper

目录 一、背景二、猜测三、源码查看步骤1、创建MapperScannerConfigurer.java2、MapperScan注解3、MapperScannerRegistrar执行registerBeanDefinitions方法4、MapperScannerConfigurer执行postProcessBeanDefinitionRegistry方法5、执行doscan6、设置beanClass7、使用jdk生成代…

万界星空科技电线电缆MES系统实现线缆全流程追溯

MES系统通过高度集成的数据平台,对电线电缆的生产全过程进行实时监控与记录,从原材料入库开始,到生产过程中的各个关键控制点,再到成品出库,每一步操作都被详细记录并可追溯。这种全流程追溯能力主要体现在以下几个方面…

在组件中显示tuku的照片

一、问题 (1)错误:域名前面一定要加http://要不然会报错 (2)在使用 defineModel传值时一定要动态绑定,要不然图片不显示 (3)改完后在商品列表中显示图片信息必须 在显示的图片中取…

Linux入门笔记(指令)

操作系统是什么? 操作系统是一款做软硬件管理的软件。计算机系统自下而上可以大致分为4部分:硬件、操作系统、应用程序和用户。操作系统管理各种计算机硬件,为应用程序提供基础,并且充当计算机硬件与用户之间的中介。重点&#x…

Mybatis——生命周期和作用域

理解不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。 SqlSessionFactoryBuilder: 一旦创建了 SqlSessionFactory,就不再需要它了。 局部方法变量 SqlSessionFactory: 可以想象为&…

力扣145题:二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[3,2,1]示例 2: 输入:root [] 输出:[]示例 3: 输入:root [1] 输出…

C++复习的长文指南

C复习的长文指南 一、入门语法知识1.预备1.1 main函数1.2 注释1.3 变量1.3 常量1.4 关键字1.5 标识符明明规则 2. 数据类型2.1 整型2.1.1 sizeof关键字 2.2 实型(浮点型)2.3 字符型2.4 转义字符2.5 字符串型2.6 布尔类型bool2.7 数据的输入 3. 运算符3.1…

SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼

概览 用 SwiftUI 框架开发过应用的小伙伴们都知道,SwiftUI 中的视图由各种属性和绑定“扑朔迷离”的缠绕在一起,自成体系。 想要在 Xcode 预览中泰然处之的调试 SwiftUI 视图有时并不是件容易的事。其中,最让人秃头码农们头疼的恐怕就要数如…

对redis进行深入学习

目录 1. 什么是redis?1.1 为什么使用redis作为缓存?1.1.0 数据库(MySQL)与 redis1. 存储介质不同(408选手应该都懂hh)2. 数据结构优化3. I/O模型差异4. CPU缓存友好性5. 单线程与多线程差异6. 持久化与缓存…

进程的地址空间

一、写个代码见一见地址空间 1、问题 在代码中我们在第五秒时会在子进程中改变全局变量 g_val 但是我们发现了一个奇怪的现象:在子进程中改变 g_val ,由于进程的独立性,所以子进程和父进程的值不一样是可以理解的,但是为什么变量…

【C++11】线程

本篇文章更多的是熟悉一下C11的线程库接口,与linux的相关线程接口是非常相似的,更多的是将面向过程改为了面向对象。 并没有一些概念的讲解。 想知道线程的相关概念的可以看一看这篇文章及后续 在C11之前,涉及到多线程问题,都是和…