《设计模式之禅》笔记摘录 - 4.抽象工厂模式

抽象工厂模式的定义

抽象工厂模式(Abstract Factory Pattern)是一种比较常用的模式,其定义如下:

Provide an interface for creating families of related or dependent objects without specifying ir concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的体类。)

抽象工厂模式是工厂方法模式的升级版本,在多个业务品种、业务分类时,通过抽象工厂模式需要的对象是一种非常好的解决方式。

通用类图如下:

抽象工厂模式的应用

抽象工厂模式的优点

封装性,每个产品的实现类不是高层模块要关心的,它要关心的是什么?是接口,是抽象,它不关心对象是如何创建出来,这由谁负责呢?工厂类,只要知道工厂类是谁,我就能创建出一个需要的对象,省时省力,优秀设计就应该如此。

产品族内的约束为非公开状态。具体的产品族内的约束是在工厂内实现的。

抽象工厂模式的缺点

抽象工厂模式的最大缺点就是产品族扩展非常困难

抽象工厂模式的使用场景

抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。

什么意思呢?例如一个文本编辑器和一个图片处理器,都是软件实体,但是linix下的文本编辑器和Windows下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也有类似情况。也就是具有了共同的约束条件:操作系统类型。于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。

抽象工厂模式的注意事项

在抽象工厂模式的缺点中,我们提到抽象工厂模式的产品族扩展比较困难,但是一定要清楚,是产品族扩展困难,而不是产品等级。在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可。也就是说横向扩展容易,纵向扩展困难。

这一点上看,抽象工厂模式是符合开闭原则的。

最佳实践

一个模式在什么情况下才能够使用,是很多读者比较困惑的地方。抽象工厂模式是一个简单的模式,使用的场景非常多,大家在软件产品开发过程中,涉及不同操作系统的时候,都可以考虑使用抽象工厂模式,例如一个应用,需要在三个不同平台(Windows、Linux、Android)上运行,你会怎么设计?分别设计三套不同的应用?非也,通过抽象工厂模式屏蔽掉操作系统对应用的影响。三个不同操作系统上的软件功能、应用逻辑、UI都应该是非常类似的,唯一不同的是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息。

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

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

相关文章

python-注释

文章目录 单行注释多行注释使用多个 # 符号使用三引号( 或 """) 特殊注释Shebang(Unix/Linux 脚本声明)编码声明(Python 2 需要)文档字符串(Docstring) 在 Python 中…

YOLO11推理模式:极速高效的目标检测新选择

一、引言 在机器学习和计算机视觉领域,模型的推理(Inference)是应用阶段的核心。Ultralytics 最新发布的 YOLO11 模型,凭借其强大的predict模式,在保证准确率的同时,极大提升了推理速度和多样数据源兼容能…

如何创建基于 TypeScript 的 React 项目

React 是一个用于构建用户界面的强大 JavaScript 库。结合 TypeScript,您可以获得类型安全和更好的开发体验。本文将详细介绍如何从头开始创建一个基于 TypeScript 的 React 项目。 1. 为什么选择 TypeScript? 在深入创建项目之前,我们先了解…

Adobe LiveCycle Designer 中脚本的层级关系

以下是Adobe LiveCycle Designer脚本体系的层级关系对比分析,结合执行时机、作用域、交互规则及典型应用场景进行系统性说明: 1. 脚本体系层级关系总览 #mermaid-svg-4ZAgQFvRk9BQdPuM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:…

在汽车中实现时间敏感网络(TSN)

随着车内以太网应用的不断扩展,精确的时间同步与可靠的数据传输变得至关重要。IEEE 802.1AS™ 提供了亚微秒级的高精度时间同步能力,这一特性将在未来汽车通信系统中发挥关键作用。 此外,其他 IEEE 标准和 TSN 技术共同支持在整个车辆范围内实现安全、超高可靠性、低延迟有…

暑假读书笔记第一天

今日文章: 小林coding:CPU 是如何执行程序的? 目录 内存中央处理器指令及其周期指令类型MIPS指令类型指令周期 指令的执行速度 冯诺依曼计算机遵循了图灵机的设计,使用了电子元件构造,约定了用二进制进行计算和存储 图灵机基本由纸带和和读…

洛谷刷题9

B4355 [GESP202506 一级] 值日 B4355 [GESP202506 一级] 值日 - 洛谷 难度&#xff1a;入门 —— 入门 这道题有三种解法&#xff0c;第三种解法在一部分比赛中被禁用 AC代码&#xff08;第一种方法&#xff1a;循环&#xff09; #include <iostream> #include <…

vuedraggable在iframe中无法使用问题

废话不多说 直接看怎么解决 <draggable:list"staticContent":animation"340"group"selectItem"handle".option-drag"start"onDragStart"end"onDragEnd" ><divv-for"(item, index) in staticConten…

数据库窗口函数详解:语法、技巧与最佳实践

数据库窗口函数详解&#xff1a;语法、技巧与最佳实践 窗口函数是SQL中用于执行复杂分析的强大工具&#xff0c;它允许在结果集的"窗口"&#xff08;一组相关行&#xff09;上进行计算&#xff0c;而不会将行分组为单个输出行。下面我将全面解析窗口函数的语法、应用…

基于开源AI大模型AI智能名片S2B2C商城小程序源码的企业资金使用效率提升路径研究

摘要&#xff1a;在中国创业市场&#xff0c;需求验证后的激烈竞争与投资方对收益率和确定性的严苛要求&#xff0c;迫使企业必须实现资金使用的极致效率。开源AI大模型AI智能名片S2B2C商城小程序源码的技术融合&#xff0c;通过重构用户触达、供应链协同与运营流程&#xff0c…

2025年- H92-Lc200-- 64.最小路径和(多维动态规划)--Java版

1.题目描述 2.思路 &#xff08;1&#xff09;dp[i][j] 表示从起点 (0,0) 走到位置 (i,j) 的最小路径和 &#xff08;2&#xff09;对于位置 (i, j)&#xff0c;只能从 上面 (i-1,j) 或 左边 (i,j-1) 走过来&#xff0c;所以&#xff1a; dp[i][j] grid[i][j] min(dp[i-1][j…

CHAIN(GAN的一种)训练自己的数据集

简介 简介:作者针对数据有限场景下GANs训练中的判别器过拟合问题,提出了CHAIN(Lipschitz连续性约束归一化)方法。作者首先从理论角度分析了GAN泛化误差,发现减少判别器权重梯度范数对提升泛化能力至关重要。然后深入研究了批归一化(BN)在GAN判别器中应用困难的根本原因…

3D建模公司的能力与技术

在数字化时代&#xff0c;3D建模公司扮演着越来越重要的角色。它们是专业从事三维建模设计服务的机构或团队&#xff0c;利用先进的三维建模软件和技术&#xff0c;为客户提供从概念设计到最终成品的全流程服务。这些服务广泛应用于建筑设计、工程规划、产品设计、动画制作等多…

《深度剖析:5G网络切片如何精准保障不同业务QoS需求》

5G网络切片技术依托网络功能虚拟化(NFV)和软件定义网络(SDN)两大核心技术。NFV就像一位神奇的变形师,把传统硬件网络功能,如路由器、防火墙、基站等,转化为软件模块,让它们能运行在通用硬件平台上。如此一来,硬件资源得以摆脱传统网络功能的束缚,实现灵活调配。例如,…

力扣hot100题(1)

目录 1、两数之和2、移动零3、相交链表4、有效的括号5、反转链表6、回文链表7、环形链表8、环形链表II9、合并两个有序链表10、二叉树的中序遍历 1、两数之和 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 方法1&#xff1a; class Solution {public int[] twoSum(i…

C++的回顾与学习之C++入门基础

目录 1、C入门 1&#xff09;C关键字 2&#xff09;命名空间 3&#xff09;C中的输入输出 4&#xff09;缺省参数 5&#xff09;函数重载 6&#xff09;引用 引用和指针的不同点&#xff1a; 7&#xff09;auto关键字 8&#xff09;内联函数 9&#xff09;指针空值nu…

【使用Android Studio调试手机app时候手机老掉线问题】

如果你各种方式都尝试失败了&#xff0c; 请看这里 连接时候通过logcat查看你手机Android的平台去SDK下载所有对应的平台SDK重新连接尝试

二叉树题解——验证二叉搜索树【LeetCode】前序遍历

98. 验证二叉搜索树 &#x1f50d; 题目目标 判断一棵二叉树是否为有效的二叉搜索树&#xff08;BST&#xff09;&#xff0c;定义如下&#xff1a; 左子树所有节点 < 根节点 右子树所有节点 > 根节点 且左右子树也必须是二叉搜索树 一、算法逻辑&#xff08;逐步通…

Javaweb - 10.3 Servlet 生命周期

目录 生命周期简介 生命周期测试 load-on-startup 补充&#xff1a;defaultServlet Servlet 的继承结构 1. 顶级的 Servlet 接口 2. 抽线的类 GenericServlet 3. HttpServlet 抽象类 4. 自定义 Servlet 补充&#xff1a; 完&#xff01; 生命周期简介 什么是生命周…

RSA数字签名方案的C语言实现(带测试)

RSA 算法的 C语言实现通常比较复杂&#xff0c;但已经有许多密码算法库实现了 RSA 算法&#xff0c;例如OpenSSL、Libgcrypt​ 和 Botan ​等。我们可以在这些库的基础上进行配置或移植&#xff0c;从而快速实现密码算法。但这些库主要面向大量设备进行优化&#xff0c;如通用计…