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

Java设计模式-抽象工厂(Abstract Factory)模式

说明

抽象工厂(Abstract Factory)模式是一种工厂模式。用一个接口类中的不同方法创建不同的产品。

为了便于理解,先打个比方:

将老虎、狮子、猴子比作三个抽象产品的接口类,也就是有3个产品等级。
老虎又分动物园的老虎、野生的老虎 — 比作具体产品
狮子又分动物园的狮子、野生的狮子 — 比作具体产品
猴子又分动物园的猴子、猴子的猴子 — 比作具体产品

动物园的动物比作一个产品族,野生的动物比作另外一个产品族,共2个产品族。

抽象工厂模式就是用一个接口中的三个方法分别创建老虎、狮子、猴子。
具体工厂实现抽象工厂,对应有两个具体工厂:动物园具体工厂、野生具体工厂。
动物园具体工厂生产动物园老虎、动物园狮子、动物园猴子。
野生具体工厂生产野生老虎、野生狮子、野生猴子。

概况起来说:

  • 有两个产品族:动物园的动物、野生动物。
  • 每个产品族中有三个产品等级:老虎、狮子、猴子。

抽象工厂模式涉及如下角色:

  • 抽象工厂(Abstract Factory)角色:它一般是一个接口类或者一个抽象类。其中声明了生产一族产品的所有方法。产品族中有几个产品等级就有几个方法。与具体的业务逻辑无关。
  • 具体工厂类(Concrete Factory):实现抽象工厂的方法。有几个产品族就有几个具体工厂类。客户端直接调用具体工厂类创建具体的产品。与具体的业务逻辑有关。
  • 抽象产品(Abstract Product)角色:一般是一个接口或者抽象类,是具体产品的父类。具体产品要实现抽象产品。
  • 具体产品(Concrete Product)角色:实现抽象产品,是客户端最终需要的产品。

代码示例

以上面打的比方来举例。

定义抽象产品

老虎接口:

package com.thb;public interface Tiger {}

狮子接口:

package com.thb;public interface Lion {}

猴子接口:

package com.thb;public interface Monkey {}

定义具体产品

动物园老虎:

package com.thb;public class ZooTiger implements Tiger {}

动物园狮子:

package com.thb;public class ZooLion implements Lion {}

动物园猴子:

package com.thb;public class ZooMonkey implements Monkey {}

野生老虎:

package com.thb;public class WildTiger implements Tiger {}

野生狮子:

package com.thb;public class WildLion implements Lion {}

野生猴子:

package com.thb;public class WildMonkey implements Monkey {}

定义抽象工厂

package com.thb;public interface Factory {Tiger createTiger();Lion createLion();Monkey createMonkey();
}

定义具体工厂

动物园工厂:

package com.thb;public class ZooFactory implements Factory {@Overridepublic Tiger createTiger() {		return new ZooTiger();}@Overridepublic Lion createLion() {		return new ZooLion();}@Overridepublic Monkey createMonkey() {		return new ZooMonkey();}}

野生工厂:

package com.thb;public class WildFactory implements Factory {@Overridepublic Tiger createTiger() {		return new WildTiger();}@Overridepublic Lion createLion() {		return new WildLion();}@Overridepublic Monkey createMonkey() {		return new WildMonkey();}}

相关文章:

Java设计模式-抽象工厂(Abstract Factory)模式

说明 抽象工厂(Abstract Factory)模式是一种工厂模式。用一个接口类中的不同方法创建不同的产品。 为了便于理解,先打个比方: 将老虎、狮子、猴子比作三个抽象产品的接口类,也就是有3个产品等级。 老虎又分动物园的…...

Hive加密,PostgreSQL解密还原

当前公司数据平台使用的处理架构,由Hive进行大数据处理,然后将应用数据同步到PostgreSQL中做各类外围应用。由于部分数据涉及敏感信息,必须在Hive进行加密,然后在PG使用时再进行单个数据解密,并监控应用的数据调用事情…...

2023年测试岗,接口测试面试题汇总+答案,拿捏面试官...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、你们公司的接口…...

C# --- Case Study

C# --- Case Study C# — Mongo数据库事务的应用 C# — 如何解析Json文件并注入MongoDB C# — MongoDB如何安全的替换Collection...

3.1 Spring MVC概述

1. MVC概念 MVC是一种编程思想,它将应用分为模型(Model)、视图(View)、控制器(Controller)三个层次,这三部分以最低的耦合进行协同工作,从而提高应用的可扩展性及可维护…...

Towards Open World Object Detection【论文解析】

Towards Open World Object Detection 摘要1 介绍2 相关研究3 开放世界目标检测4 ORE:开放世界目标检测器4.1 对比聚类4.2 RPN自动标注未知类别4.3 基于能量的未知标识4.4 减少遗忘 5 实验5.1开放世界评估协议5.2 实现细节5.3 开放世界目标检测结果5.4 增量目标检测结果 6 讨论…...

IP协议

目录 网络层 理解路由选择 IP协议 IP首部 IP分片原理 IP校验和原理 网段划分 IP地址数量限制 私有和公网IP地址 路由 什么是IP地址,IP地址有什么特征?IP地址和MAC地址有什么区别和联系? IP报文由IP头部和IP数据两个部分组成&#…...

使用sqlplus连接oracle,提示ORA-01034和ORA-27101

具体内容如下 PL/SQL Developer 处 登录时 终端处 登录时 ERROR: ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Process ID: 0 Session ID: 0 Serial number: 0 解决方法是执行以下命令 sqlplus /nolog conn / as sysdba startup …...

TLS协议

目录 什么是TLS协议? TLS的基本流程? 两种密钥交换算法? 基于ECDHE密钥交换算法的TLS握手过程? 基于RSA密钥交换算法的TLS握手过程? 基于RSA的握手和基于ECDHE的握手有什么区别? 什么是前向保密&…...

Academic Inquiry|国外文献查找

一个失去了男子气概的人总有很多忧虑,这样就可以分散注意力,而不必为那件特别的羞耻而苦恼不堪。 ——《狂野之夜》〔美〕乔伊斯卡罗尔欧茨著 樊维娜译 许多研究者在进行研究的时候,都会查找对应主体的国内外引用文献,而大多得出的…...

opencv图片灰度二值化

INCLUDEPATH D:\work\opencv_3.4.2_Qt\include LIBS D:\work\opencv_3.4.2_Qt\x86\bin\libopencv_*.dll #include <iostream> #include<opencv2/opencv.hpp> //引入头文件using namespace cv; //命名空间 using namespace std;//opencv这个机器视…...

短肥网络的 RTT 敏感性

周二下班路上发了一则朋友圈&#xff1a; 长肥管道的特征和问题谈得够多了&#xff0c;但这里谈的是短肥管道&#xff0c;因为下面趋势&#xff0c;短肥管道才是未来大势&#xff1a; 云计算致使数据中心网络快速发展&#xff0c;而数据中心网络时延短&#xff0c;带宽大。CD…...

Nonebot实战之编写插件1

前言 应粉丝群内粉丝要求&#xff0c;我也决定写一个Nonebot插件编写教程&#xff0c;从0开始教学。有些不对的地方也欢迎大家指正&#xff0c;修改。 开始 准备 合适的代码编辑器一定的python基础懂得提问的方式 代码编辑器 代码编辑器有很多种选择&#xff0c;比如 vsc…...

Linux-C++开发项目:基于主从Reactor模式的高性能并发服务器

目录 1.项目介绍2.1项目部署2.2安装版本较高的编译器 2.项目开发过程2.1网络库模块开发2.1.1简单日志宏的实现2.1.2Buffer模块实现2.1.3Socket模块实现2.1.4Channel模块实现2.1.5Poller模块实现2.1.6TimerWheel模块实现2.1.7EventLoop模块实现2.1.8整合测试12.1.9LoopThread模块…...

【Linux的开胃小菜】Linux系统安装后初始化配置操作

我们刚接手一台刚安装好服务器系统之后&#xff0c;可以对系统进行一些基础优化&#xff1a; 常规设定&#xff1a; centos: 1.关闭 iptables 2.关闭 selinux 3.设定 ChronyUbuntu: 4. /etc/security/limits.conf 5. /etc/sysctl.conf1.首先使用国内阿里云的yum源&#xff08…...

Java批量下载书籍图片并保存为PDF的方法

背景 因为经常出差火车上没网、不方便电子书阅读器批注&#xff0c;需要从某网站上批量下载多本书籍的图片并自动打包成PDF文件。 分析 1、尝试获得图片地址&#xff0c;发现F12被禁 解决方法&#xff1a;使用Chrome浏览器&#xff0c;点击右上角三个点呼出菜单&#xff0c;…...

flutter 创建lib

在根目录下创建 packages 文件夹创建lib (flutter create --templatepackage xxx)需要在pubspec.yaml中的根目录下添加 publish_to: ‘none’ # 如果你想发布到pub.dev&#xff0c;请删除这一行配置 lib_rock_utils:path: packages/lib_rock_utils...

深度剖析堆栈指针

为什么打印root的值与&root->value的值是一样的呢 测试结果&#xff1a; *号一个变量到底取出来的是什么&#xff1f; 以前我写过一句话&#xff0c;就是说&#xff0c;如果看到一个*变量&#xff0c;那就是直逼这个变量所保存的内存地址&#xff0c;然后取出里面保存的…...

C++笔记之静态成员函数的使用场景

C笔记之静态成员函数的使用场景 C静态成员函数的核心特点是不与特定类实例相关&#xff0c;可通过类名直接调用&#xff0c;用于执行与类相关的操作而无需创建类对象。其主要用途是在类级别上共享功能&#xff0c;管理全局状态或提供工具函数。 code review! 文章目录 C笔记之…...

Nginx的优化和防盗链

一、Nginx的优化 1、隐藏版本号 curl -I http://192.168.79.28 #查看信息&#xff08;版本号等&#xff09;方法一&#xff1a;修改配置文件 vim /usr/local/nginx/conf/nginx.conf vim /usr/local/nginx/conf/nginx.conf http {include mime.types;default_type ap…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...