基于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.hqwc.cn/news/705535.html

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

相关文章

牛客NC404 最接近的K个元素【中等 二分查找+双指针 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/b4d7edc45759453e9bc8ab71f0888e0f 知识点 二分查找&#xff1b;找到第一个大于等于x的数的位置idx;然后从idx开始往两边扩展Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、…

UnitTest / pytest 框架

文章目录 一、UnitTest框架1. TestCase使用2. TestSuite 和 TestRunner3. TestLoader4. Fixture装置5. UnitTest断言1. 登录案例 6. 参数化1. parameterized插件 7. unitTest 跳过 二、pytest 框架1. 运行方式3.读取配置文件(常用方式) 2. pytest执行用例的顺序1. 分组执行(冒烟…

ArcGIS10.X入门实战视频教程(arcgis入门到精通)

点击学习&#xff1a; ArcGIS10.X入门实战视频教程&#xff08;GIS思维&#xff09;https://edu.csdn.net/course/detail/4046?utm_sourceblog2edu 点击学习&#xff1a; ArcGIS10.X入门实战视频教程&#xff08;GIS思维&#xff09;https://edu.csdn.net/course/detail/404…

【Python从入门到进阶】54、使用Python轻松操作SQLite数据库

一、引言 1、什么是SQLite SQLite的起源可以追溯到2000年&#xff0c;由D. Richard Hipp&#xff08;理查德希普&#xff09;所创建。作为一个独立的开发者&#xff0c;Hipp在寻找一个能够在嵌入式系统中使用的轻量级数据库时&#xff0c;发现现有的解决方案要么过于庞大&…

CAD插入文字到另一图形样式变相同

CAD从一张图形复制到另外一张图形后&#xff0c;文字样式变成一样是因为两张图所用的文字样式名称一样&#xff0c;但是样式里面的使用字体样式不一样。如下图所示&#xff0c;找到工具栏中的注释 &#xff0c;点击文字样式。里面就会显示当前图形中使用的样式名称及其对应的字…

C++map容器关联式容器

Cmap 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器&#xff0c;其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身&#xff0c;这样的容器被统称为序列式容器。而map、set是一种关联式容器&#xff0c;关联式容器也是用来存储数据的&#xff0…

【计算机毕业设计】springboot反诈科普平台的设计与实现

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低反诈科普平台的运营人员成本&#xff0c;实现了反诈科普平台的 标准化、制度化、程序化的管理&#xff0c;有效地防止了反诈科普平台的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够…

数据库审计系统Yearning使用笔记

一、启动 1、初始化MySQL 启动mysql docker run -d --namemysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot mysql:5.7创建数据库&#xff0c;链接数据库并执行以下创建库的脚步&#xff0c;注意字符集 create database yearning char set utf8mb42、启动Yeelabs 需要执行…

2022 年高教社杯全国大学生数学建模竞赛-C 题 古代玻璃制品的成分分析与鉴别详解+聚类模型Python代码源码

前言 简单介绍一下我自己&#xff1a;博主专注建模四年&#xff0c;参与过大大小小数十来次数学建模&#xff0c;理解各类模型原理以及每种模型的建模流程和各类题目分析方法。参与过十余次数学建模大赛&#xff0c;三次美赛获得过二次M奖一次H奖&#xff0c;国赛二等奖。**提…

postman 请求上传文件,post请求携带文件,以及对应postMapping 处接收写法

一、postman 处表单携带文件的方式 先要修改content-type 必须改&#xff0c;否则不支持 Content-Type multipart/form-dataBody 表单处 二、JavaWeb PostMapping 处接收的写法 不要带 RequestBody 不要带 RequestBody 不要带 RequestBody PostMapping(value "/imp…

IT革新狂潮:引领未来的技术趋势

方向一&#xff1a;技术革新与行业应用 当前现状&#xff1a; 量子计算&#xff1a;量子计算的研究正在加速&#xff0c;尽管目前仍处于初级阶段&#xff0c;但其在药物研发、加密技术和材料科学等领域的应用潜力已被广泛认可。 虚拟现实&#xff08;VR&#xff09;与增强现实…

##21 深入理解文本处理:使用PyTorch进行NLP基础操作

文章目录 前言简介文本预处理实现分词构建词汇表 文本向量化构建简单的文本分类模型结论 前言 在现代深度学习应用中&#xff0c;文本处理是不可或缺的一部分&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;领域。借助强大的框架如PyTorch&#xff0c;我们可以更加…