基于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.xdnf.cn/news/1424469.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AutoNeRF:Training Implicit Scene Representations with Autonomous Agents

论文概述 《AutoNeRF》是由Pierre Marza等人撰写的一篇研究论文&#xff0c;旨在通过自主智能体收集数据来训练隐式场景表示&#xff08;如神经辐射场&#xff0c;NeRF&#xff09;。传统的NeRF训练通常需要人为的数据收集&#xff0c;而AutoNeRF则提出了一种使用自主智能体高效…

Yalmip使用教程(8)-常见报错及调试方法

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍使用yalmip工具箱编程过程中的常见错误和相应的解决办法。 1.optimize的输出参数 众所周知&#xff0c;optimize是yalmip用来求…

Tomcat无法连通的调试方法1-service方式无法连通

作者&#xff1a;私语茶馆 1.局域网Tomcat服务不通 组网如下&#xff1a; 问题&#xff1a; Tomcat Server 服务方式启动后&#xff0c;无法访问&#xff0c;但命令行方式启动可以。IP地址都在同网段或不同网段现象都一样。 2.Tomcat 服务安装与调试 在Windows下&#xff0c;…

Cadence 16.6 绘制PCB封装时总是卡死的解决方法

Cadence 16.6 绘制PCB封装时总是卡死的解决方法 在用Cadence 16.6 PCB Editor绘制PCB封装时候&#xff0c;绘制一步卡死一步&#xff0c;不知道怎么回事儿&#xff0c;在咨询公司IT后&#xff0c;发现是WIN系统自带输入法的某些热键与PCB Editor有冲突&#xff0c;导致卡死。 …

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 拼数字

//bfs只能过40%。 #include<bits/stdc.h> using namespace std; #define int long long int a,b,c,dp[2028]; struct s {int x,y,z;string m; }; map<vector<int>,int>k; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a…

[链表专题]力扣141, 142

1. 力扣141 : 环形链表 题 : 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

git 基础

【一】介绍 &#xff08;1&#xff09;软件开发模式 瀑布式开发 线性、顺序的开发流程&#xff0c;严格按照需求分析、设计、编码、测试、交付等阶段进行。每个阶段都必须在前一个阶段完成后才能开始&#xff0c;因此开发周期长&#xff0c;难以应对需求变更。适用于需求明确…

2024网上可申请离婚,无需对方同意!

&#x1f383;很多客户决定离婚之后却因为不了解离婚流程没准备好所需材料&#xff0c;导致离婚失败&#xff0c;或者无故被对方e意拖延&#xff0c;无计可施&#xff0c;无可奈何&#xff01; &#x1f383;别怕&#xff0c;2024年离婚新规定已发布&#xff0c;离婚变的简单了…

利用管道通信(pipe)测量进程间的上下文切换(context switch)开销

利用管道通信(pipe)测量进程间的上下文切换(context switch)开销 《https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-mechanisms.pdf》 Measuring the cost of a context switch is a little trickier. The lmbench benchmark does so by running two processes on a single CPU…

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

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

kafka用java收发消息

用java客户端代码来对kafka收发消息 具体代码如下 package com.cool.interesting.kafka;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; i…

基于springboot+vue+Mysql的大学生社团活动平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

电脑缺失api-ms-win-crt-runtime-l1-1-0.dll文件的几种修复方法

当您在使用电脑过程中遇到程序启动失败&#xff0c;提示缺少“api-ms-win-crt-runtime-l1-1-0.dll”文件时&#xff0c;不必过于焦虑&#xff0c;此问题通常与Windows系统的Visual C Redistributable组件未正确安装或损坏有关。小编将介绍5种修复电脑缺失api-ms-win-crt-runtim…

STM32-09-IWDG

文章目录 STM32 IWDG1. IWDG2. IWDG框图3. IWDG寄存器4. IWDG寄存器操作步骤5. IWDG溢出时间计算6. IWDG配置步骤7. 代码实现 STM32 IWDG 1. IWDG IWDG Independent watchdog&#xff0c;即独立看门狗&#xff0c;本质上是一个定时器&#xff0c;这个定时器有一个输出端&#…

webpack生成模块关系依赖图示例:查看构建产物的组成部分 依赖关系图

npm i -D webpack-bundle-analyzer core-js babel-loaderwebpack.config.js const BundleAnalyzerPlugin require(webpack-bundle-analyzer).BundleAnalyzerPlugin; module.exports {entry: ./src/index.js,output: {filename: main.js,},// mode: production, // 或者 produ…

学前端网络安全这块还不懂?细说CSRF

什么是CSRF&#xff1f; 举个栗子&#xff0c;比如我们需要在某个博客上删除一个文章&#xff0c;攻击者首先在自己的域构造一个页面&#xff0c;使用了一个img标签&#xff0c;其地址指向了删除博客的链接。攻击者诱使目标用户&#xff0c;也就是博客主访问这个页面&#xff…

如何利用命令提示符列出文件?这里提供了几个实例供你参考

序言 什么命令可以用来列出目录中的文件&#xff1f;如何在命令提示符Windows 10/11中列出文件&#xff1f;很多人对这些问题感到困惑。在这篇文章中&#xff0c;我们详细解释了命令提示符列出文件的主题。 CMD&#xff08;命令提示符&#xff09;是一个功能强大的Windows内置…

Android实践:查看Activity信息

问题&#xff1a;本地Android SDK的monitor无法正常运行&#xff0c;看不了进程相关信息&#xff0c;确认当前显示Activity十分不便 解决办法&#xff1a;使用adb shell指令可以快速查看 命令&#xff1a; adb shell dumpsys activity activities 这个命令用于获取Android设…

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…