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

设计模式(十):抽象工厂模式(创建型模式)

        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架构详解

文章目录 概述架构详解核心组件虚拟主机&#xff08;Virtual Host&#xff09;RabbitMQ 有几种广播类型 概述 RabbitMQ是⼀个高可用的消息中间件&#xff0c;支持多种协议和集群扩展。并且支持消息持久化和镜像队列&#xff0c;适用于对消息可靠性较高的场合 官网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…...

深度学习模型部署(四)常用模型及推理平台评估指标

判断选择什么模型&#xff0c;什么量化方案&#xff0c;什么推理框架&#xff0c;最基础的知识就是如何评估自己的模型以及推理平台。 模型衡量标准 衡量一个模型的最直接标准就是运算速度&#xff0c;但是运算速度是无法计算的&#xff0c;所以定义了一些间接标准来推测模型的…...

【控制台警告】npm WARN EBADENGINE Unsupported engine

今天用webpack下载几个loader依赖&#xff0c;爆出了三个警告&#xff0c;大概的意思就是本地安装的node和npm的版本不是很匹配&#xff1f; 我的解决思路是&#xff1a; 先检查node和npm版本 然后去官网查找版本的对应 靠&#xff0c;官网404 Node.js (nodejs.org) 就找到…...

ArmSoM Rockchip系列产品 通用教程 之 GPIO 使用

1. GPIO简介​ GPIO&#xff0c;全称 General-Purpose Input/Output&#xff08;通用输入输出&#xff09;&#xff0c;是一种在计算机和嵌入式系统中常见的数字输入输出接口。它允许软件控制硬件的数字输入和输出&#xff0c;例如开关、传感器、LED灯等。GPIO通常由一个芯片或…...

npm镜像源地址

镜像源地址替换问题&#xff08;重要&#xff09; 2024 年 1 月 22 日 &#xff0c;registry.npm.taobao.org 的 SSL 证书正式过期。 2022 年 5 月 淘宝源发布了公告&#xff1a; &#xff08;大家应该没有太多关注哦&#xff0c;也包括我&#xff0c;哈哈&#xff09; &am…...

Java的Writer类详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…...

R语言基础的代码语法解译笔记

1、双冒号&#xff0c;即&#xff1a;“::” 要使用某个包里的函数&#xff0c;通常做法是先加载&#xff08;library&#xff09;包&#xff0c;再调用函数。最新加载的包的namespace会成为最新的enviroment&#xff0c;某些情况下可能影响函数的结果。而package name::funct…...

【蓝桥杯】蓝桥杯算法复习(一)

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…...

移动端精准测试简介

在测试领域每隔一段时间&#xff0c;就会有一些主流的测试技术&#xff0c;比如说&#xff1a;接口自动化&#xff0c;WebUI, AppUI自动化&#xff0c;然后就是测试平台的开发&#xff0c;各类专项测试&#xff08;性能&#xff0c;安全&#xff09;,再到前几年的手机集群云测平…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...