基于SpringBoot设计模式之创建型设计模式·工厂方法模式

文章目录

  • 介绍
  • 开始
    • 架构图
    • 样例一
      • 定义工厂
      • 定义具体工厂(上衣、下装)
      • 定义产品
      • 定义具体生产产品(上衣、下装)
    • 测试样例
  • 总结
    • 优点
    • 缺点
    • 与抽象工厂不同点

介绍

  在 Factory Method模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体的处理全部交给子类负责。这样就可以将生成实例的框架(framework)和实际负责生成实例的类解耦。

开始

架构图

工厂方法设计模式

样例一

定义工厂

public interface Factory {/*** 工厂可以制作 穿搭衣服** @param name 产品名称* @return*/WearProduct createProduct(String name);/*** 获取工厂里面生成的所有产品** @return*/List<WearProduct> getProducts();
}

定义具体工厂(上衣、下装)

@Service
@Slf4j
public class ClothesFactory implements Factory {// 花花公子工厂,穿搭产品private List<WearProduct> wearProducts = new ArrayList<>();@Overridepublic WearProduct createProduct(String name) {// 按照springboot的形式,这里工厂生产完产品,产品是会入库的。// 为了快速能了解 工厂方法定义,不做过多的,展示WearProduct wearProduct = new ClothesProduct(name);wearProducts.add(wearProduct);return wearProduct;}@Overridepublic List<WearProduct> getProducts() {// 按照springboot的形式,应直接取工厂下面所有的产品。// 为了快速能了解 工厂方法定义,这里仅将list输出return wearProducts;}}
@Service
@Slf4j
public class TrousersFactory implements Factory {// 优衣库工厂,穿搭产品private List<WearProduct> wearProducts = new ArrayList<>();@Overridepublic WearProduct createProduct(String name) {// 按照springboot的形式,这里工厂生产完产品,产品是会入库的。// 为了快速能了解 工厂方法定义,不做过多的,展示WearProduct wearProduct = new TrousersProduct(name);wearProducts.add(wearProduct);return wearProduct;}@Overridepublic List<WearProduct> getProducts() {// 按照springboot的形式,应直接取工厂下面所有的产品。// 为了快速能了解 工厂方法定义,这里仅将list输出return wearProducts;}
}

定义产品

public interface WearProduct {/*** 展示产品*/void show();}

定义具体生产产品(上衣、下装)

@Service
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class ClothesProduct implements WearProduct {private String name;@Overridepublic void show() {System.out.println("这是一个上衣:" + name);}
}
@Service
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class TrousersProduct implements WearProduct {private String name;@Overridepublic void show() {System.out.println("这是一个下装:" + name);}
}

测试样例

@Slf4j
@SpringBootTest(classes = FactoryMethodApplication.class)
public class TestFactoryMethod {@Resourceprivate Map<String, Factory> factoryMap;@Testpublic void testWear() {Factory clothesFactory = factoryMap.get("clothesFactory");Factory trousersFactory = factoryMap.get("trousersFactory");clothesFactory.createProduct("潇洒");clothesFactory.createProduct("百搭");List<WearProduct> clothesFactoryProducts = clothesFactory.getProducts();System.out.println("-------------------上衣产品展览---------------");for (WearProduct wearProduct : clothesFactoryProducts) {wearProduct.show();}trousersFactory.createProduct("和谐");trousersFactory.createProduct("简约");List<WearProduct> trousersFactoryProducts = trousersFactory.getProducts();System.out.println("-------------------下装产品展览---------------");for (WearProduct wearProduct : trousersFactoryProducts) {wearProduct.show();}}}

总结

优点

  1. 符合单一职责设计原则,每个具体工厂类只负责创建对应的产品。
  2. 新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可

缺点

  1. 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销
  2. 一个具体工厂只能创建一种具体产品

与抽象工厂不同点

  • 工厂模式:通常有一个具体的工厂类负责创建某一类产品,客户端直接调用工厂类的方法来获取所需的产品。
  • 抽象工厂模式:往往需要管理多个工厂,同时这多个工厂中的各个工厂,又负责创建不同的产品(零件)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像/视频恢复和增强CodeFormer

github&#xff1a;https://github.com/sczhou/CodeFormer 尝试增强旧照片/修复人工智能艺术 面部修复 面部色彩增强和恢复 脸部修复

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 目录 Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 一、简单介绍 二、监督学习 算法 说明前的 数据集 说明 三、监督学习 之 核支持向量机 1、线性模型与非线性特征 …

基于网络爬虫技术的网络新闻分析(二)

目录 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3 系统概要设计 3.1 设计约束 3.1.1 需求约束 3.1.2 设计策略 3.1.3 技术实现 3.3 模块结构 3.3.1 模块结构图 3.3.2 系统层次图 3.3.3…

JumpServer堡垒机应用(v3.10.8) 下

目录 JumpServer堡垒机简单式部署与管理(v3.10.8) 上-CSDN博客 一. 资产管理 1.1创建资产 1.2 给资产主机创建用户 1.2.1 普通账户&#xff1a; 1.2.2 特权账户&#xff1a; 1.2.3 创建用户 二. 命令过滤 2.1 创建命令组 2.2 创建命令过滤 ​编辑 三. 创建资产授权 …

在另外一个页面,让另外一个页面弹框显示操作(调佣公共的弹框)vue

大概意思是&#xff0c;登录弹框在另外一个页面中&#xff0c;而当前页面不存在&#xff0c;在当前页面中判断如果token不存在&#xff0c;就弹框出登录的弹框 最后一行 window.location.href … 如果当前用户已登录&#xff0c;则执行后续操作(注意此处&#xff0c;可不要)

2024中国应急(消防)品牌巡展西安站成功召开!惊喜不断

消防品牌巡展西安站 5月10日&#xff0c;由中国安全产业协会指导&#xff0c;中国安全产业协会应急创新分会、应急救援产业网联合主办&#xff0c;陕西消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-西安站成功举办。该巡展旨在展示中国应急&#xff08;消防&am…

ADS使用记录之使用RFPro进行版图联合仿真

ADS使用记录之使用RFPro进行版图联合仿真 在ADS中&#xff0c;我们往往使用EM仿真来明确电路的实际性能&#xff0c;但是常规的方法我们只会得到S参数&#xff0c;对于场还有电路的电流分布往往不进行检查。但是在实际中&#xff0c;观察场和电流分布是非常有意义的&#xff0…

Python送你小花花

快到520了&#xff0c;准备好送上你的爱意了吗&#xff1f; 还记得去年从网上模仿了一篇python使用turtle画的小花花程序&#xff0c;当时还没有转行到程序员行业&#xff0c;刚刚入门学习编程&#xff0c;还在纠结是学习python、Java还是C#的时候。 总会被一些猎奇的内容吸引&…

在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; 在Linux系统上使用nmcli命令配置各种网络&#xff08;有线、无线、vlan、vxlan等&#xff09;https://myweb.myskillstree.cn/123.html 更新于2024/5/13&…

01.认识HTML及常用标签

目录 URL&#xff08;统一资源定位系统&#xff09; HTML&#xff08;超文本标记语言&#xff09; 1&#xff09;html标签 2&#xff09;head标签 3&#xff09;title标签 4&#xff09;body标签 标签的分类 DTD文档声明 基础标签 1&#xff09;H系列标签 2&#xff09…

Linux 第三十四章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

【RSGIS数据资源】2001-2021 年亚洲季风区主要国家作物种植制度数据集

文章目录 1. 数据集概况2. 数据格式3. 文件名命名规则4. 数据生产服务单位5. 元数据6. 数据引用与参考文献引用 1. 数据集概况 2001-2021 年亚洲季风区主要国家作物种植制度数据集&#xff08;ACIA500&#xff09;是结合MODIS 影像和现有的土地利用等多源数据&#xff0c;基于…

CNN卷积神经网络初学

1.为什么要学CNN 在传统神经网络中&#xff0c;我们要识别下图红色框中的图像时&#xff0c;我们很可能识别不出来&#xff0c;因为这六张图的位置都不通&#xff0c;计算机无法分辨出他们其实是一种形状或物体。 这是传统的神经网络图&#xff0c;通过权重调整神经元和神经元…

五丰黎红销量增长的秘诀:一物一码数字化营销开创调味品行业新格局!

根据当今经济环境和未来的发展趋势&#xff0c;传统经济向数字化经济转型的发展方向可以说是大势所趋&#xff0c;如何把握先机&#xff0c;率先迈出数字化转型第一步&#xff0c;可以说是无数传统企业都需要思考的问题。 作为中国调味品行业的佼佼者&#xff0c;五丰黎红踩着时…

荣耀MagicBook X 14 Pro锐龙版 2023 集显(FRI-H76)笔记本电脑原装出厂Windows11系统工厂模式安装包下载,带F10智能还原

恢复开箱状态预装OEM系统&#xff0c;适用型号&#xff1a;HONOR荣耀FRI-H76、FRI-H56 链接&#xff1a;https://pan.baidu.com/s/1Lcg45byotu5kDDSBs3FStA?pwdl30r 提取码&#xff1a;l30r 华为荣耀原装WIN11系统工厂安装包&#xff0c;含F10一键恢复功能、系统自带所有驱…

##22 深入理解Transformer模型

文章目录 前言1. Transformer模型概述1.1 关键特性 2. Transformer 架构详解2.1 编码器和解码器结构2.1.1 多头自注意力机制2.1.2 前馈神经网络 2.2 自注意力2.3 位置编码 3. 在PyTorch中实现Transformer3.1 准备环境3.2 构建模型3.3 训练模型 4. 总结与展望 前言 在当今深度学…

居家短视频怎么拍:四川京之华锦信息技术公司

居家短视频怎么拍&#xff1a;技巧与创意指南 在数字化时代&#xff0c;短视频已成为人们生活中不可或缺的一部分。无论是分享生活点滴&#xff0c;还是展示个人才艺&#xff0c;短视频都为我们提供了一个广阔的舞台。对于许多人来说&#xff0c;居家拍摄短视频既方便又实用。…

山东大学计算机考研数据分析,初复试占比6:4,复试内容不少得花精力准备!

山东大学&#xff08;ShandongUniversity&#xff09;&#xff0c;简称山大&#xff0c;位于中国山东&#xff0c;是中华人民共和国教育部直属的综合性全国重点大学&#xff0c;是国家“211工程”、“985工程”重点建设院校&#xff0c;入选“111计划”、“珠峰计划”、“卓越工…

一种请求头引起的跨域问题记录(statusCode = 400/CORS)

问题表象 问题描述 当我们需要在接口的headers中添加一个自定义的变量的时候&#xff0c;前端的处理是直接在拦截器或者是接口配置的地方直接进行写&#xff0c;比如下面的这段比较基础的写法&#xff1a; $http({method: "post",url:constants.backend.SERVER_LOGIN…

判断上三角矩阵 分数 15

题目展示&#xff1a; 代码展示&#xff1a; 点这里&#xff0c;输入题目名称即可检索更多题目答案 ​#include<stdio.h>int main() {//T-tint t 0;scanf("%d",&t);while(t--)//循环t次&#xff0c;处理t个矩阵{int n 0;scanf("%d",&n);…