【GoF 23】篇3:抽象工厂
1. 什么是抽象工厂?
提供一个创建一系列相关或互相依赖的对象接口,而无需指定它们的具体类。
抽象工厂是一个超级工厂,是其他工厂的工厂,或将简单工厂进一步抽象。
这样来理解:
我们将科技公司可以做的事情简要枚举出来,生产手机、电脑、路由器等等,比如小米、华为、联想等公司都可以生产这些产品。
这里,我们就可以将科技公司可以生产的产品全部在一个接口中枚举出来,这个接口就可以看作一个抽象工厂。而小米、华为、联想这些公司就是普通工厂。抽象工厂将普通工厂可以生产的产品进行抽象出来。
这里有两个概念:产品簇、产品级
- 产品簇:或许称之为“产品系”会更便于理解,比如小米生产的手机、电脑都是小米系列的,这就是一个产品簇。
- 产品级:或许称之为“产品类”会更便于理解,手机和手机就是一个产品级,它们都是同一类商品,都是手机。
2. 代码示例
- 定义普通工厂的抽象工厂
// 抽象工厂,抽象方法为科技公司可以生产的产品
public interface ProductFactory {// 可以生产手机,产品簇PhoneProduct phoneProduct();// 可以生产电脑,产品簇ComputerProduct computerProduct();}
- 定义普通手机工厂
// 产品级
public interface PhoneFactory { ... }
- 定义普通电脑工厂
// 产品级
public interface ComputerFactory { ... }
- 定义小米生产手机
public class XiaoMiPhone implements PhoneFactory{ ... }
- 定义小米生产电脑
public class XiaoMiComputer implements ComputeFactory{ ... }
- 定义小米工厂,在这里实现抽象工厂
// 小米工厂要实现抽象工厂,抽象工厂就是将工厂可以做的事情抽象出来,具体行为由子工厂去定义
// 其实这里就是一个简单工厂,所以抽象工厂就是对简单工厂的抽象
public class XiaoMiFactory implements ProductFactory {// 小米可以生产手机public PhoneProduct phoneProduct(){return new XiaoMiPhone();// 在这里创建对象,但是具体行为在子类中}// 小米可以生产电脑public XiaoMiComputer xiaoMiComputer(){return new XiaoMiComputer();}
}
- 客户端
XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
xiaoMiFactory.phoneProduct();//创建手机的实例
xiaoMiFactory.xiaoMiComputer()//创建电脑的实例
3. 小结
抽象工厂的本质就是:选择产品簇的实现。
相关文章:
【GoF 23】篇3:抽象工厂
1. 什么是抽象工厂? 提供一个创建一系列相关或互相依赖的对象接口,而无需指定它们的具体类。 抽象工厂是一个超级工厂,是其他工厂的工厂,或将简单工厂进一步抽象。 这样来理解: 我们将科技公司可以做的事情简要枚举…...
软考高级信息系统项目管理师系列之三十七:流程管理
软考高级信息系统项目管理师系列之三十七:流程管理 一、流程管理内容二、流程管理基础概念知识1.企业业务流程的整体目标2.业务流程的核心3.流程六要素4.良好的业务流程管理步骤5.企业流程管理的层次三、流程管理过程1.业务流程分析2.业务流程分析的主要方法3.业务流程分析工具…...
【WPS文字-Word】WPS文字设置段落居中对齐后公式左边右边的文字仍然无法跟公式对齐,公式和文字对不齐
一、问题背景 原来的公式左边文字是底端,右边文字是居中,我想着让左右文字全跟公式居中对齐,就全部设置了段落居中对齐。 结果发现,公式左右边的文字依然无法居中对齐。左边的文字是居中,但是右边的文字变成了顶端对…...
英文术语对照
underlying asset 标的资产 leverage 杠杆 forward 远期 futures 期货 options 期权 delivery 交割 broker 证券机构/经理人 CBOT 芝加哥交易所 long futures position 多头 short futures position 空头 spot price 现货价格 future price 期货价格 over-the-coun…...
CSS 扫盲
✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录引入方式内部样式内联样式外部样式CSS 选择器CSS 常用属性值字体属性设置字体大小粗细文字样式文本属性文本颜色文本对齐文本装…...
【Redis黑马点评】基于session实现登录【短信验证码登录、登录验证功能、拦截器】过程详解
文章目录一. 黑马点评Redis项目实践1.1开发环境搭建1.1.1 数据库1.1.2 Springboot项目1.1.3 前端配置1.2 基于session实现登录1.2.1 发送短信验证码1.2.2 短信验证码登录1.2.3 登录验证功能1.2.3.1 编写拦截器一. 黑马点评Redis项目实践 1.1开发环境搭建 1.课程介绍ÿ…...
【C++】通过priority_queue、reverse_iterator加深对于适配器和仿函数的理解
苦尽甘来 文章目录一、仿函数(仿函数就是一个封装()运算符重载的类)1.C语言的函数指针2.C的仿函数对象二、priority_queue中的仿函数1.模拟实现优先级队列1.1 优先级队列的本质(底层容器为vector的适配器)1.2 向下调整算法建堆1.3…...
网络安全 -- 常见的攻击方式和防守
网络安全 – 常见的攻击方式和防守 一 . 网页中出现黑链 特点: 隐藏,不易发现,字体大小是0,表面上看不出来,代码层面可以查出来,也可能极限偏移,颜色一致 表现: 多表现为非法植入链接,一般点击会跳转至其他网页 例如: 1.澳门新葡京等赌博网站,获取流量,有人甚至会充钱参与赌…...
Android中实现滑动的7种方法
Android中实现滑动的7种方法前置知识Android坐标系视图坐标系触控事件---MotionEvent获取坐标的方法实现滑动的7种方法layout方法offsetLeftAndRight()和offsetTopAndBottom()LayoutParamsscrollTo和scrollByScroller属性动画ViewDragHelper参考前置知识 Android坐标系 Andro…...
【hadoop】介绍
目录 介绍 版本 优势 大数据技术生态体系 介绍 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 解决 存储和分析计算Google在大数据方面的三篇论文GFS --->HDFS Map-Reduce --->MR BigTable --->HBaseHadoop创始人Doug Cutting版本 Hadoop 三大发行版本&a…...
【C语言】有关的经典题型内含数组及递归函数题型讲解(入门适用)
C语音经典题型1. 在屏幕上输出9*9乘法口诀表2. 求10 个整数中最大值3. 计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值,打印出结果4. 编写程序数一下 1到 100 的所有整数中出现多少个数字95. 能把函数处理结果的二个数据返回给主调函数6. 实现一个函数,…...
MyBatis操作数据库
目录 MyBatis 功能架构 学习MyBatis 第一个MyBatis查询 1、创建数据库和表 2、搭建MyBatis开发环境 2.1、在项目中添加MyBatis框架 2.2、配置数据库连接信息 2.3、配置MyBatis中xml的保存路径(规则) 3、添加业务代码 3.1、创建实体类 3.2、构…...
Object.keys(obj)与Object.values(obj)的用法
语法 Object.keys(obj) 参数:要返回其枚举自身属性的对象 返回值:一个表示给定对象的所有枚举属性的字符串数组 传入对象,返回属性名 1 var obj {a:123,b:345}; 2 console.log(Object.keys(obj)); //[a,b] 处理字符串,返回索…...
关于ES6新特性的总结
目录1.let & const2.解构赋值3.模板字符串4.简化对象写法5.箭头函数6.函数参数的默认值设置7.rest参数8.扩展运算符9.SymbolSymbol特点创建SymbolSymbol使用场景Symbol内置值10.迭代器11.生成器12.Promise基本使用Promise封装读取文件Promise封装ajaxPromise.prototype.the…...
13. CSS 处理
提取 Css 成单独文件CSS 文件目前被打包到 js 文件中,当 js 文件加载时,会创建一个 style 标签来生成样式,加载一个页面的时候,先 html -> js -> css,会有页面闪屏现象,用户体验不好。应该是单独的 Css 文件&…...
One-hot编码
One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。 例如: 自然状态码为:000,001,010,011,100,1…...
Java中的深克隆与浅克隆
浅克隆: 实现Cloneable接口即可实现,浅克隆只对象内部的基础数据类型(包括包装类)被克隆,引用数据类型(负责对象)会被使用引用的方式传递。 简单来说,就是浅克隆属性如果是复杂对象…...
如何使用MyBatis框架实现对数据库的增删查改?
目录:1.创建MyBatis项目以及如何配置2.MyBatis操作数据库的模式3.实现增删查改注意:在我们操作数据库之前,先要保证我们已经在数据库建好了一张表。创建MyBatis项目以及如何配置我们在创建项目的时候,引入MyBatis相关依赖配置数据…...
结构体内存大小
000、前言 要想计算结构体内存大小,就会涉及到一个结构体内存对齐的问题,而不是对其成员进行简单的加运算 (1)在写本博客之前 有位同学和我讨论了一个学校的题目,题目如下: 我借这道题目问了另外一位同…...
gerrit操作和jinkens编译合入代码
gerrit 先 查看自己的push 找到后添加reviewer 填写邮箱开头就可以出来 记得1 然后send 让人review 编译不过,gerrit上查看 1.是不是checkstyle问题 2.编译不过,去jinkens查看 先retrigger重新编译 如果发现多次编译失败 则要看下console output 查…...
终极指南:MobileAgent如何用AI智能体彻底改变跨平台自动化体验
终极指南:MobileAgent如何用AI智能体彻底改变跨平台自动化体验 【免费下载链接】MobileAgent Mobile-Agent: The Powerful GUI Agent Family 项目地址: https://gitcode.com/GitHub_Trending/mo/mobileagent 你是否曾经想过,如果有一个AI助手能够…...
BUUCTF:[网鼎杯 2018]Fakebook 漏洞链深度剖析:从SQL注入到SSRF的实战利用
1. 初探Fakebook:信息收集与源码泄露 打开题目链接后,我习惯性地在URL后添加/robots.txt进行探测。这个文件就像网站的"藏宝图",经常能发现开发者不想被公开的路径。果然,在这里发现了/user.php.bak这个备份文件。下载后…...
构建个人技能知识库:从Markdown管理到自动化实践
1. 项目概述:一个技能库的诞生与价值最近在整理个人知识体系时,我一直在思考一个问题:如何将那些零散的、跨领域的“技能点”系统化地管理起来,形成一个可以持续迭代、随时取用的个人工具箱?这不仅仅是写一份简历上的技…...
PLC编程入门学习路径
PLC编程入门学习路径基础概念理解PLC(可编程逻辑控制器)是一种工业自动化控制设备。需要理解其工作原理、硬件组成(CPU、I/O模块、电源等)以及常见的品牌(如西门子、三菱、欧姆龙)。编程语言学习PLC常用编程…...
从零上手向量数据库:基于Pinecone官方示例构建AI应用实战指南
1. 项目概述:从零上手向量数据库与AI应用开发如果你对AI应用开发感兴趣,尤其是想了解如何让大语言模型(LLM)拥有“记忆”,或者想构建一个能理解语义而非关键词的智能搜索系统,那么你很可能已经听说过“向量…...
开源AI工具集Muse:模块化架构与创意工作流实践指南
1. 项目概述:一个面向创意工作者的开源AI工具集最近在开源社区里,一个名为myths-labs/muse的项目引起了我的注意。乍一看这个名字,你可能会联想到艺术灵感,但实际上,它是一个定位非常精准的开发者工具集合。简单来说&a…...
AI驱动音乐合成:JUCE与LibTorch实时音频插件开发全解析
1. 项目概述:当AI遇见音乐合成 如果你和我一样,既是个音乐制作爱好者,又对前沿技术充满好奇,那么最近在GitHub上出现的 martinic/DrMixAISynth 项目,绝对值得你花上一个周末的时间好好研究一番。这个项目,…...
从零到一:深入拆解 I/O 多路复用的前世今生与实战选型
1. 从单线程阻塞到多路复用:I/O模型的进化史 第一次写网络程序时,你可能遇到过这样的场景:服务器在accept()一个客户端连接后,整个程序就像被冻住一样,直到这个客户端发送数据才能继续运行。这就是最原始的阻塞I/O模型…...
Linux安装配置小龙虾【openclaw】(飞牛NAS OS)
OneAPI & NewAPI 完全指南:从零开始搭建你的AI模型聚合网关 在AI大模型百花齐放的今天,我们常常需要同时使用多个模型提供商的服务——OpenAI的GPT-4、Anthropic的Claude、Google的Gemini、国内的文心一言、通义千问等等。每个提供商都有自己的API接…...
别再死记硬背公式了!用‘能量流动’视角图解RLC二阶电路,轻松理解零输入响应
能量流动视角:用物理直觉破解RLC二阶电路零输入响应之谜 想象一下,你手中握着一个透明的能量沙漏。上层的沙子(电能)缓缓流入下层(磁能),又因为重力作用回弹,形成有节奏的流动——这…...
