设计模式(十):抽象工厂模式(创建型模式)
Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对
象的接口,而无须指定它们的具体类。
之前写过简单工厂和工厂方法模式(创建型模式),这两种模式比较简单。
简单工厂模式其实不符合开闭原则,即对修改关闭,扩展开放。简单工厂每次需要新增新的产品就需要修改工厂类。而工厂方法模式,每个工厂只负责创建单一的产品,相当于真实工厂里面的一条流水线,如果一个工厂自身能创建多个产品呢?那就需要抽象工厂了。
三种工厂模式的区别:
简单工厂模式:一个抽象产品类(或接口),可以派生出多个具体产品类。
只有一个静态工厂,负责创建多个具体产品类的实例。
工厂方法模式:一个抽象产品类(或接口),可以派生出多个具体产品类。
一个抽象工厂类(或接口),可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类(或接口),可以派生出多个具体产品类。
一个抽象工厂类(或接口),可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类(或接口),而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
“抽象工厂”就像真的工厂,“工厂方法”就像工厂中的一条生产线。
抽象工厂模式Demo:
先看类图:

工程结构:

上代码:
package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:Fruit* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:水果接口* @Date:2024/3/8 10:25* @Author:figo*/
public interface Fruit {//采摘void pick();
}package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:Apple* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:苹果产品* @Date:2024/3/8 10:32* @Author:figo*/
public class Apple implements Fruit{@Overridepublic void pick() {System.out.println("采摘苹果");}
}package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:Banana* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:香蕉产品* @Date:2024/3/8 10:35* @Author:figo*/
public class Banana implements Fruit{@Overridepublic void pick() {System.out.println("采摘香蕉");}
}package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:Bag* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:包装盒接口* @Date:2024/3/8 10:36* @Author:figo*/
public interface Bag {//打包void pack(Fruit fruit);
}package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:AppleBag* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:苹果包装盒* @Date:2024/3/8 10:37* @Author:figo*/
public class AppleBag implements Bag{@Overridepublic void pack(Fruit fruit) {System.out.println("苹果盒打包苹果");}
}package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:BananaBag* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:香蕉包装盒* @Date:2024/3/8 10:37* @Author:figo*/
public class BananaBag implements Bag{@Overridepublic void pack(Fruit fruit) {System.out.println("香蕉盒打包苹果");}
}package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:AbstractFactory* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:抽象工厂,能生产多种产品,比工厂方法模式只能生产单一产品更强* @Date:2024/3/8 10:42* @Author:figo*/
public abstract class AbstractFactory {public abstract Fruit getFruit();public abstract Bag getBag();
}package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:AppleFactory* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:苹果工厂能生产苹果和苹果包装盒* @Date:2024/3/8 10:46* @Author:figo*/
public class AppleFactory extends AbstractFactory{@Overridepublic Fruit getFruit() {return new Apple();}@Overridepublic Bag getBag() {return new AppleBag();}
}package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:BananaFactory* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:香蕉工厂,能生产香蕉也能生产香蕉包装盒* @Date:2024/3/8 10:49* @Author:figo*/
public class BananaFactory extends AbstractFactory{@Overridepublic Fruit getFruit() {return new Banana();}@Overridepublic Bag getBag() {return new BananaBag();}
}package com.figo.study2024.pattern.abstractfactory;/*** @ClassName:FruitGardenClient* @PackageName:com.figo.study2024.pattern.abstractfactory* @Description:水果园客户端,测试抽象工厂模式* @Date:2024/3/8 10:51* @Author:figo*/
public class FruitGardenClient {public static void main(String[] args) {fruitOrder();}/*** 水果订单*/public static void fruitOrder(){//初始化工厂AbstractFactory factory = new AppleFactory();//spring使用注入方式,这里测试苹果工厂//苹果工厂能生产苹果Fruit fruit = factory.getFruit();fruit.pick();//苹果工厂也能生产包装盒Bag bag = factory.getBag();bag.pack(fruit);//以下物流运输业务。。。。}
}
相关文章:
设计模式(十):抽象工厂模式(创建型模式)
Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对 象的接口,而无须指定它们的具体类。 之前写过简单工厂和工厂方法模式(创建型模式),这两种模式比较简单。 简单工厂模式其实不符合开闭原则,即对修改关闭…...
计算机网络概论01
计算机系统基础知识 基本组成 计算机系统由硬件和软件组成。 硬件由五大部分,他们分别是: 运算器 执行算数运算和逻辑运算控制器 控制cpu的工作,决定了计算机运行过程的自动化。包括指令控制逻辑、时序控制逻辑、总线控制逻辑和中断控制逻辑…...
新零售SaaS架构:订单履约系统架构设计(万字图文总结)
什么是订单履约系统? 订单履约系统用来管理从接收客户订单到将商品送达客户手中的全过程。 它连接了上游交易(客户在销售平台下单环)和下游仓储配送(如库存管理、物流配送),确保信息流顺畅、操作协同&…...
Hive SQL 开发指南(三)优化及常见异常
在大数据领域,Hive SQL 是一种常用的查询语言,用于在 Hadoop上进行数据分析和处理。为了确保代码的可读性、维护性和性能,制定一套规范化的 Hive SQL 开发规范至关重要。本文将介绍 Hive SQL 的基础知识,并提供一些规范化的开发指…...
Spring Boot 自动装配的原理!!!
SpringBootApplication SpringBootConfiguration:标识启动类是一个IOC容器的配置类 EnableAutoConfiguration: AutoConfigurationPackage:扫描启动类所在包及子包中所有的组件,生…...
Linux运维_Bash脚本_编译安装Wayland-1.22.0
Linux运维_Bash脚本_编译安装Wayland-1.22.0 Bash (Bourne Again Shell) 是一个解释器,负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件,并于 1989 年发布的免费软件,作为 Sh (Bourne Shell) 的替代品。 您可以在 Linu…...
Python数字类型
文章目录 Python数字类型1. 数字类型1.1 数字类型概述1.2 整数类型1.3 浮点数类型1.4 复数 2. 数字类型的操作2.1 内置的数值运算操作符2.2 内置的数值运算函数2.3 内置的数字类型转换函数 思考与练习 Python数字类型 1. 数字类型 1.1 数字类型概述 数字是自然界计数活动的抽…...
每天一个数据分析题(一百九十六)
在多元线性回归模型的自变量选择方法中,关于向后回归法和逐步回归法的描述,以下哪些是正确的? A. 向后回归法开始时包含所有自变量,并逐步剔除每个不显著的变量。 B. 逐步回归法结合了向前回归法和向后回归法,可以在…...
华为北向网管NCE开发教程(1)闭坑选接口协议
华为北向网管NCE开发教程(1)闭坑选接口协议 华为北向网管NCE开发教程(2)REST接口开发 华为北向网管NCE开发教程(3)CORBA协议开发 本文一是记录自己开发华为北向网管遇到的坑,二是给需要的人&…...
JavaScript极速入门-综合案例(3)
综合案例 猜数字 预期效果 代码实现 <button type"button" id"reset">重新开始一局游戏</button><br>请输入要猜的数字:<input type"text" id"number"><button type"button" id"button&q…...
RabbitMQ架构详解
文章目录 概述架构详解核心组件虚拟主机(Virtual Host)RabbitMQ 有几种广播类型 概述 RabbitMQ是⼀个高可用的消息中间件,支持多种协议和集群扩展。并且支持消息持久化和镜像队列,适用于对消息可靠性较高的场合 官网https://www.…...
编译内核错误 multiple definition of `yylloc‘
编译内核错误 # make ARCHarm CROSS_COMPILEarm-mix410-linux- uImageHOSTLD scripts/dtc/dtc /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss0x10): multiple definition of yylloc; scripts/dtc/dtc-lexer.lex.o:(.bss0x0): first defined here collect2: error: ld ret…...
深度学习模型部署(四)常用模型及推理平台评估指标
判断选择什么模型,什么量化方案,什么推理框架,最基础的知识就是如何评估自己的模型以及推理平台。 模型衡量标准 衡量一个模型的最直接标准就是运算速度,但是运算速度是无法计算的,所以定义了一些间接标准来推测模型的…...
【控制台警告】npm WARN EBADENGINE Unsupported engine
今天用webpack下载几个loader依赖,爆出了三个警告,大概的意思就是本地安装的node和npm的版本不是很匹配? 我的解决思路是: 先检查node和npm版本 然后去官网查找版本的对应 靠,官网404 Node.js (nodejs.org) 就找到…...
ArmSoM Rockchip系列产品 通用教程 之 GPIO 使用
1. GPIO简介 GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种在计算机和嵌入式系统中常见的数字输入输出接口。它允许软件控制硬件的数字输入和输出,例如开关、传感器、LED灯等。GPIO通常由一个芯片或…...
npm镜像源地址
镜像源地址替换问题(重要) 2024 年 1 月 22 日 ,registry.npm.taobao.org 的 SSL 证书正式过期。 2022 年 5 月 淘宝源发布了公告: (大家应该没有太多关注哦,也包括我,哈哈) &am…...
Java的Writer类详解
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…...
R语言基础的代码语法解译笔记
1、双冒号,即:“::” 要使用某个包里的函数,通常做法是先加载(library)包,再调用函数。最新加载的包的namespace会成为最新的enviroment,某些情况下可能影响函数的结果。而package name::funct…...
【蓝桥杯】蓝桥杯算法复习(一)
😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!Ǵ…...
移动端精准测试简介
在测试领域每隔一段时间,就会有一些主流的测试技术,比如说:接口自动化,WebUI, AppUI自动化,然后就是测试平台的开发,各类专项测试(性能,安全),再到前几年的手机集群云测平…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
