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

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

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

    • 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💖点点关注,收藏不迷路💖

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 云计算遭遇的主要安全威胁
  • el-tree动态添加子节点的问题
  • 加拿大上市药品查询-加拿大药品数据库
  • 2.3 大模型硬件基础:AI芯片(上篇) —— 《带你自学大语言模型》系列
  • I can‘t link the chatbot model with react
  • Scrcpy adb server version (41) doesn‘t match this client (39); killing...
  • Python - conda使用大全
  • docker笔记4-镜像理解
  • [解决方法]git上传的项目markdown文件的图片无法显示
  • 视频下载(m3u8或者其他格式的)
  • 创建vue2/vue3项目
  • 计算机网络八股文(三)
  • 使用vscode搜索打开的文件夹下的文件
  • 闲鱼、抖音、快手纷纷入局,“谷子”经济千亿市场纷争再起
  • java之回合制游戏以及如何优化
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 2017届校招提前批面试回顾
  • cookie和session
  • flutter的key在widget list的作用以及必要性
  • java概述
  • Js基础知识(四) - js运行原理与机制
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • oschina
  • PHP的类修饰符与访问修饰符
  • React中的“虫洞”——Context
  • Redux系列x:源码分析
  • vagrant 添加本地 box 安装 laravel homestead
  • vue学习系列(二)vue-cli
  • 爱情 北京女病人
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 提醒我喝水chrome插件开发指南
  • 一个完整Java Web项目背后的密码
  • 用jquery写贪吃蛇
  • Java性能优化之JVM GC(垃圾回收机制)
  • 带你开发类似Pokemon Go的AR游戏
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (zt)最盛行的警世狂言(爆笑)
  • (笔试题)分解质因式
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十八)SpringBoot之发送QQ邮件
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略