java设计模式-工厂模式(下)
接java设计模式-工厂模式(上)
抽象工厂模式
针对耳机的生产需求,我们可以知道,刚才的工厂已经不满足了,因为只是生产一类产品-手机,但是现在我们需要的工厂类是要生产一个产品族(手机和耳机)。
每个手机产品的耳机要求可以进行变动,可以是无线的,也可以是有线的。
模式结构
- AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品
- ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
- AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
- ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
我们依然保留开始的AbstractPhone类, 以及一加和真我两个具体产品类。(YijiaPhone,ZhenwoPhone)
在此基础上,我们再定义一个耳机的抽象产品类 以及 两个耳机具体产品类(有线,无线)。
/*** 耳机的抽象产品类** @author jiangkd* @date 2023/7/28 15:17:28*/
public abstract class AbstractHeadset {/*** 耳机类型,有线无线*/public abstract void type();/*** 音质*/public abstract void tone();}
两个耳机具体实现类
/*** 耳机具体实现类, 有线耳机** @author jiangkd* @date 2023/7/28 15:19:54*/
@Slf4j
public class YouxianHeadset extends AbstractHeadset {@Overridepublic void type() {log.info("我是有线耳机!!!");}@Overridepublic void tone() {log.info("有线耳机, 音质杠杠的!!!");}
}
/*** 耳机具体实现类, 无线耳机** @author jiangkd* @date 2023/7/28 15:21:14*/
@Slf4j
public class WuxianHeadset extends AbstractHeadset {@Overridepublic void type() {log.info("我是无线耳机!!!");}@Overridepublic void tone() {log.info("无线耳机, 音质妥妥的!!!");}}
定义一个工厂类,用来生产一族产品(手机和耳机)
/*** 抽象工厂类** @author jiangkd* @date 2023/7/28 15:23:13*/
public abstract class AbstractFactory {/*** 生产手机* @return*/public abstract AbstractPhone createPhone();/*** 生产耳机* @return*/public abstract AbstractHeadset createHeadset();}
一加手机的生产实现类,一加手机 + 无线耳机
/*** 一加手机产品族工厂具体实现类** @author jiangkd* @date 2023/7/28 15:34:46*/
public class YijiaFactory extends AbstractFactory {@Overridepublic AbstractPhone createPhone() {return new YijiaPhone();}/*** 一加手机配无线耳机* @return*/@Overridepublic AbstractHeadset createHeadset() {return new WuxianHeadset();}}
然后是真我手机的生产实现类,真我手机 + 有线耳机
/*** 真我手机产品族工厂具体实现类** @author jiangkd* @date 2023/7/28 15:44:17*/
public class ZhenwoFactory extends AbstractFactory {@Overridepublic AbstractPhone createPhone() {return new ZhenwoPhobe();}/*** 有线耳机** @return*/@Overridepublic AbstractHeadset createHeadset() {return new YouxianHeadset();}
}
测试一下
/*** @author jiangkd* @date 2023/7/28 15:45:02*/
@Slf4j
public class DemoTest {public static void main(String[] args) {// 生产 一加手机 + 耳机final AbstractFactory yijiaFactory = new YijiaFactory();final AbstractPhone yijiaPhone = yijiaFactory.createPhone();final AbstractHeadset yijiaHeadset = yijiaFactory.createHeadset();yijiaPhone.brand();yijiaPhone.color();yijiaHeadset.type();yijiaHeadset.tone();log.info("--------------------------------");// 生产 真我手机 + 耳机final AbstractFactory zhenwoFactory = new ZhenwoFactory();final AbstractPhone zhenwoPhone = zhenwoFactory.createPhone();final AbstractHeadset zhenwoHeadset = zhenwoFactory.createHeadset();zhenwoPhone.brand();zhenwoPhone.color();zhenwoHeadset.type();zhenwoHeadset.tone();}}
执行结果记录日志:
15:50:20.523 [main] INFO demo.basic.example.design_patterns.gcms.YijiaPhone - 品牌, 一加手机!!!
15:50:20.526 [main] INFO demo.basic.example.design_patterns.gcms.YijiaPhone - 黑色!!!
15:50:20.526 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.WuxianHeadset - 我是无线耳机!!!
15:50:20.526 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.WuxianHeadset - 无线耳机, 音质妥妥的!!!
15:50:20.526 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.DemoTest - --------------------------------
15:50:20.527 [main] INFO demo.basic.example.design_patterns.gcms.ZhenwoPhobe - 品牌, 真我手机!!!
15:50:20.527 [main] INFO demo.basic.example.design_patterns.gcms.ZhenwoPhobe - 白色!!!
15:50:20.527 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.YouxianHeadset - 我是有线耳机!!!
15:50:20.527 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.YouxianHeadset - 有线耳机, 音质杠杠的!!!
相关文章:
java设计模式-工厂模式(下)
接java设计模式-工厂模式(上) 抽象工厂模式 针对耳机的生产需求,我们可以知道,刚才的工厂已经不满足了,因为只是生产一类产品-手机,但是现在我们需要的工厂类是要生产一个产品族(手机和耳机&a…...

深蓝学院C++基础与深度解析笔记 第13章 模板
1. 函数模板 ● 使用 template 关键字引入模板: template<typename T> //声明:T模板形参void fun(T); // T 函数形参template<typename T> //定义void fun(T) {...}– 函数模板不是函数 –…...

装饰器模式——扩展系统功能
1、简介 1.1、概述 对新房进行装修并没有改变房屋用于居住的本质,但它可以让房子变得更漂亮、更温馨、更实用、更能满足居家的需求。在软件设计中,也有一种类似新房装修的技术可以对已有对象(新房)的功能进行扩展(装…...

无涯教程-jQuery - jQuery.get( url, data, callback, type )方法函数
jQuery.get(url,[data],[callback],[type])方法使用GET HTTP请求从服务器加载数据。 该方法返回XMLHttpRequest对象。 jQuery.get( url, [data], [callback], [type] ) - 语法 $.get( url, [data], [callback], [type] ) 这是此方法使用的…...

【Vue3】递归组件
1. 递归组件mock数据 App.vue <template><div><Tree :data"data"></Tree></div> </template><script setup lang"ts"> import { reactive } from vue; import Tree from ./components/Tree.vue; interface Tr…...

【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织
前言 在数据科学和数据分析领域,Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具,帮助我们高效地处理和分析数据。其中,索引在Pandas中扮演着关键角色,它是一种强大的数据组织和访问机制,使我们…...

matlab进阶:求解在约束条件下的多元目标函数最值(fmincon函数详解)
🌅*🔹** φ(゜▽゜*)♪ **🔹*🌅 欢迎来到馒头侠的博客,该类目主要讲数学建模的知识,大家一起学习,联系最后的横幅! 喜欢的朋友可以关注下,私信下次更新不迷路࿰…...

Kotlin知识点
Kotlin 是 Google 推荐的用于创建新 Android 应用的语言。使用 Kotlin,可以花更短的时间编写出更好的 Android 应用。 基础 Kotlin 程序必须具有主函数,这是 Kotlin 编译器在代码中开始编译的特定位置。主函数是程序的入口点,或者说是起点。…...

亚马逊云科技联合霞光社发布《2013~2023中国企业全球化发展报告》
中国企业正处于全球聚光灯下。当企业全球化成为时代发展下的必然趋势,出海也从“可选项”变为“必选项”。中国急速扩大的经济规模,不断升级的研发和制造能力,都在推动中国企业不断拓宽在全球各行业的疆域。 过去十年,是中国企业…...

【解析excel】利用easyexcel解析excel
【解析excel】利用easyexcel解析excel POM监听类工具类测试类部分测试结果备注其他 EasyExcel Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&…...
JQuery操作单选按钮Radio和复选框checkbox
获取选中值: $(input:radio:checked).val();$("input[typeradio]:checked").val();$("input[namerd]:checked").val();$("input[idrand_question]:checked").val();设置第一个Radio为选中值: $(input:radio:…...

7.28 作业 QT
手动完成服务器的实现,并具体程序要注释清楚: widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //对话框类 #include …...
HTML <pre> 标签
定义和用法 pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。 <pre> 标签的一个常见应用就是用来表示计算机的源代码。 可以导致段落断开的标签(例如标题、"><p> 和 标签"><a…...

查询结果元数据-MetaData对象、数据库工具类的封装、通过反射实现数据查询的封装
六、查询结果元数据-MetaData对象 七、数据库工具类的封装 1、PropertieUtil类 2、DbUtil类 3、DBHepler类 查询: 4、TestDb测试类: 更新: 1)插入: 2)修改: 3)删除: 查…...

【Minio中间件】上传图片并Vue回显
流程: 目录 1.文件服务器Minio的安装 1.1 下载Minio安装后,新建1个data文件夹。并在该安装目录cmd 敲命令。注意不要进错目录。依次输入 1.2 登录Minio网页端 1.3 先建1个桶(buckets),点击create a bucket 2. Spr…...

Jmeter配置不同业务请求比例,应对综合场景压测
需求: 每次向服务器发出请求时,先生成一个随机数,我们对随机数的取值划分若干个范围(对应若干个业务请求),然后对随机数进行判断,当随机数落在某个范围内,就可以执行对应的请求。比…...

数学分析:流形的线性代数回顾
因为是线性的,所以可以把所有的系数都提取出去。这也是多重线性代数的性质。可以看成基本的各项自变量的乘法。 这里可以看到两个不同基向量下,他们的坐标转化关系。 引出了张量积,也就是前面提到的内容。 对偶空间的例子总是比较美好。 因为…...
前端请求后端接口返回错误码
1、如果 HTTP Code 是 2xx 范围内的,那通常表明请求已经成功处理,并且可以根据具体的 HTTP Code 进一步判断请求的处理结果。比如: HTTP Code 200 表明请求成功,并返回了请求资源;HTTP Code 204 表明请求成功…...
【Java Web】Nacos 介绍和安装教程
文章目录 1. Nacos 介绍1.1 Nacos 的定义1.2 Nacos 的主要功能1.2.1 服务注册与发现1.2.2 配置管理1.2.3 动态 DNS 服务1.2.4 服务和元数据管理 1.3 Nacos 的适用场景1.3.1 微服务架构1.3.2 动态配置管理1.3.3 多环境部署1.3.4 云原生应用 2. Nacos 的核心组件2.1 服务注册与发…...

web漏洞-java安全(41)
这个重点是讲关于java的代码审计,看这些漏洞是怎么在java代码里面产生的。 #Javaweb 代码分析-目录遍历安全问题 这个漏洞原因前面文章有,这次我们看看这个漏洞如何在代码中产生的,打开靶场 解题思路就是通过文件上传,上传文件…...
C++中const关键字详解:不同情况下的使用方式
在 C 中,const 关键字用于指定一个对象或变量是常量,意味着它的值在初始化之后不能被修改。下面详细介绍 const 修饰变量、指针、类对象和类中成员函数的区别以及注意事项。 修饰变量 详细介绍 当 const 修饰变量时,该变量成为常量&#x…...

Golang——5、函数详解、time包及日期函数
函数详解、time包及日期函数 1、函数1.1、函数定义1.2、函数参数1.3、函数返回值1.4、函数类型与变量1.5、函数作参数和返回值1.6、匿名函数、函数递归和闭包1.7、defer语句1.8、panic和recover 2、time包以及日期函数2.1、time.Now()获取当前时间2.2、Format方法格式化输出日期…...
SQL Server全局搜索:在整个数据库中查找特定值的高效方法
SQL Server全局搜索:在整个数据库中查找特定值的高效方法 一、需求背景:为什么需要数据库全局搜索? 在数据库管理和开发过程中,我们经常会遇到这样的场景: 只记得某个数据值,但忘记了它所在的表或列需要…...

集成学习三种框架
集成学习通过组合多个弱学习器构建强学习器,常见框架包括Bagging(装袋)、Boosting(提升) 和Stacking(堆叠) 一、Bagging(自助装袋法) 核心思想 从原始数据中通过有放回…...
Go语言爬虫系列教程5:HTML解析技术以及第三方库选择
Go语言爬虫系列教程5:HTML解析技术以及第三方库选择 在上一章中,我们使用正则表达式提取网页内容,但这种方法有局限性。对于复杂的HTML结构,我们需要使用专门的HTML解析库。在这一章中,我们将介绍HTML解析技术以及如何…...
深入理解MySQL死锁:从原理、案例到解决方案
一、MySQL死锁的概念与定义 1. 死锁的基本定义 MySQL中的死锁是指两个或多个事务在同一资源上相互等待对方释放锁,导致这些事务都无法继续执行的情况。从本质上讲,死锁是多个事务形成了一个等待环路,每个事务都在等待另一个事务所持有的锁资…...

Code Composer Studio CCS 工程设置,如何设置h文件查找路径?
右键工程,选Properties,在Build>MSP430 Compiler>Optinizution Include Options 设置头文件的搜索路径。 比如我设置了这些: ${CCS_BASE_ROOT}/msp430/include ${PROJECT_ROOT} ${CG_TOOL_ROOT}/include "${workspace_loc:/${ProjName}/F5xx_F6xx_Core_Lib}&quo…...

OrCAD X Capture CIS设计小诀窍系列第二季--03.如何在Capture中输出带有目录和元器件信息的PDF
背景介绍:我们在进行原理图设计时,经常需要输出PDF来查看或评审,但通过”Print”功能导出的PDF较为简单,只能查看设计视图;而通过使用Ghostscript软件可以输出带有目录和元器件信息的PDF,让设计师可以直接在…...

【论文阅读笔记】万花筒:用于异构多智能体强化学习的可学习掩码
摘要 在多智能体强化学习(MARL)中,通常采用参数共享来提高样本效率。然而,全参数共享的流行方法通常会导致智能体之间的策略同质,这可能会限制从策略多样性中获得的性能优势。为了解决这一关键限制,我们提出…...
第八部分:第五节 - 生命周期与副作用 (`useEffect` Hook):组件的幕后工作
知识点: 组件生命周期(挂载 Mounting, 更新 Updating, 卸载 Unmounting - 高级概念),副作用 (Side Effects),useEffect Hook (用于处理副作用,如数据获取、订阅、DOM 操作),useEffect 的依赖数组…...