基于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<>();

    @Override
    public WearProduct createProduct(String name) {

        // 按照springboot的形式,这里工厂生产完产品,产品是会入库的。
        // 为了快速能了解 工厂方法定义,不做过多的,展示
        WearProduct wearProduct = new ClothesProduct(name);
        wearProducts.add(wearProduct);

        return wearProduct;

    }

    @Override
    public List<WearProduct> getProducts() {
        // 按照springboot的形式,应直接取工厂下面所有的产品。
        // 为了快速能了解 工厂方法定义,这里仅将list输出
        return wearProducts;
    }

}
@Service
@Slf4j
public class TrousersFactory implements Factory {

    // 优衣库工厂,穿搭产品
    private List<WearProduct> wearProducts = new ArrayList<>();

    @Override
    public WearProduct createProduct(String name) {

        // 按照springboot的形式,这里工厂生产完产品,产品是会入库的。
        // 为了快速能了解 工厂方法定义,不做过多的,展示
        WearProduct wearProduct = new TrousersProduct(name);
        wearProducts.add(wearProduct);

        return wearProduct;
    }

    @Override
    public List<WearProduct> getProducts() {
        // 按照springboot的形式,应直接取工厂下面所有的产品。
        // 为了快速能了解 工厂方法定义,这里仅将list输出
        return wearProducts;
    }
}

定义产品

public interface WearProduct {

    /**
     * 展示产品
     */
    void show();

}

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

@Service
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class ClothesProduct implements WearProduct {

    private String name;

    @Override
    public void show() {
        System.out.println("这是一个上衣:" + name);
    }
}

@Service
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class TrousersProduct implements WearProduct {

    private String name;

    @Override
    public void show() {
        System.out.println("这是一个下装:" + name);
    }
}

测试样例

@Slf4j
@SpringBootTest(classes = FactoryMethodApplication.class)
public class TestFactoryMethod {

    @Resource
    private Map<String, Factory> factoryMap;

    @Test
    public 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. 一个具体工厂只能创建一种具体产品

与抽象工厂不同点

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用红黑树封装出map与set

目录 一、红黑树的改造 节点结构的定义 迭代器类的实现 红黑树中提供迭代器 红黑树的主要代码 二、set的实现 三、map的实现 四、测试代码 map与set的底层都是红黑树&#xff0c;所以本篇文章就分享如何用同一颗红黑树封装出map与set 所以大家可以先去看一下我的讲解红…

第一个fyne应用

第一个fyne应用 由于在写一个milvus的图形化工具&#xff0c;方便客户端使用&#xff0c;调研了一下只有这fyne的go-gui的star最多&#xff0c;比较流行&#xff0c;因此打算使用这个框架来进行milvus的工具开发。 第一个fyne应用 依赖go.mod: module fynedemogo 1.20requi…

【自然语言处理】【大模型】DeepSeek-V2论文解析

论文地址&#xff1a;https://arxiv.org/pdf/2405.04434 相关博客 【自然语言处理】【大模型】DeepSeek-V2论文解析 【自然语言处理】【大模型】BitNet&#xff1a;用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58&#xff1a;1bit LLM时代 【自然语言处理】【长文本…

k8s环境部署的集成arthas-spring-boot-starter spingboot项目无法访问控制台

前言 k8s环境部署的集成arthas-spring-boot-starter项目无法访问控制台&#xff0c;springboot项目集成arthas-spring-boot-starter 会自带个控制台 供我们访问 但是当使用k8s环境部署后 这个页面就无法访问了 分析 首先看下arthas对应的配置 arthas-spring-boot-starter 中…

数据结构(C):树的概念和二叉树初见

目录 &#x1f37a;0.前言 1.树概念及结构 2.认识一棵树 3.树的表示 3.1树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 4.二叉树 4.1特殊的二叉树 4.2二叉树的性质 &#x1f48e;5.结束语 &#x1f37a;0.前言 言C之言&#xff0c;聊C之识&…

先有JVM还是先有垃圾回收器?很多人弄混淆了

是先有垃圾回收器再有JVM呢&#xff0c;还是先有JVM再有垃圾回收器呢&#xff1f;或者是先有垃圾回收再有JVM呢&#xff1f;历史上还真是垃圾回收更早面世&#xff0c;垃圾回收最早起源于1960年诞生的LISP语言&#xff0c;Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析…

实验三:机器学习1.0

要求&#xff1a; 针对实验1和实验2构建的数据集信息分析 设计实现通过数据简介进行大类分类的程序 代码实现&#xff1a; 训练集数据获取&#xff1a; read_data.py import json import pickledef read_intro():data []trypathr"E:\Procedure\Python\Experiment\f…

【计算机毕业设计】springboot城市公交运营管理系统

二十一世纪我们的社会进入了信息时代&#xff0c; 信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

wefaf

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

算法学习(7)-树

目录 开启“树”之旅 二叉树 堆--优先队列 并查集 开启“树”之旅 是不是很像一棵倒挂的树&#xff1f;也就是说它是根朝上&#xff0c; 而叶子朝下的。不像&#xff1f;哈哈&#xff0c;来看看下面的图你就会觉得像啦。 你可能会间&#xff1a; 树和图有什么区别&#xff…

纯血鸿蒙APP实战开发——Worker子线程中解压文件

介绍 本示例介绍在Worker 子线程使用ohos.zlib 提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作&#xff0c;解压成功后将解压路径返回主线程&#xff0c;获取解压文件列表。 效果图预览 使用说明 点击解压按钮&#xff0c;解压test.zip文件&#xff0c;显…

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…

用SwitchHosts模拟本地域名解析访问

一.用SwitchHosts模拟本地域名解析访问 1.下载地址 https://download.csdn.net/download/jinhuding/89313168 2.使用截图

Python自动化SQL注入和数据库取证工具库之sqlmap使用详解

概要 在网络安全领域,SQL注入仍然是最常见的攻击之一。sqlmap是一个开源的自动化SQL注入和数据库取证工具,它提供了广泛的功能来检测和利用SQL注入漏洞。本文将详细介绍sqlmap的安装、特性、基本与高级功能,并结合实际应用场景,展示其在网络安全测试中的应用。 安装 sqlm…

激光打标机:手机制造中不可或缺的加工设备

激光打标机在手机行业中有多种应用&#xff0c;主要体现在以下几个方面&#xff1a; 1. 手机外壳打标&#xff1a;光纤激光打标机在手机外壳上打标的痕迹非常美观&#xff0c;可以印上厂家品牌标识&#xff0c;既保证了手机外壳的美观&#xff0c;也提高了产品的打标质量和加工…

云曦实验室期中考核题

Web_SINGIN 解题&#xff1a; 点击打开环境&#xff0c;得 查看源代码&#xff0c;得 点开下面的超链接&#xff0c;得 看到一串base64编码&#xff0c;解码得flag 简简单单的文件上传 解题&#xff1a; 点击打开环境&#xff0c;得 可以看出这是一道文件上传的题目&#x…

2024年最新软件测试面试题必问的1000题!

我了解的测试理论和方法包括以下几个方面&#xff1a; 黑盒测试与白盒测试&#xff1a; 黑盒测试&#xff1a;基于对软件系统外部行为进行测试&#xff0c;独立于内部代码实现细节。黑盒测试关注输入与输出之间的关系以及软件功能是否符合预期。白盒测试&#xff1a;基于对软件…

搭载全新升级viaim AI,讯飞会议耳机Pro 2首销价1399元起

2024年5月15日&#xff0c;人工智能硬件公司未来智能发布了讯飞会议耳机Pro 2、iFLYBUDS 2以及Kit 2三款旗舰新品&#xff0c;为用户带来全新升级的viaim AI&#xff0c;也为AIGC智能耳机树立了新标杆。 在发布会上&#xff0c;未来智能CEO马啸表示&#xff1a;在AIGC领域&…

基于EBAZ4205矿板的图像处理:05均值滤波算法

基于EBAZ4205矿板的图像处理&#xff1a;05均值滤波算法 项目全部文件已经上传&#xff0c;是免费的 先看效果 可以明显看到图像变糊了&#xff0c;这就是均值滤波的特点&#xff0c;将噪声均摊到每个点上的同时&#xff0c;也会让图像丢失细节。 算法讲解 均值滤波&#x…

连锁收银系统如何助力实体门店私域运营

作为实体门店&#xff0c;私域运营是提升客户黏性和增加复购率的重要策略之一。而连锁收银系统在私域运营中扮演了关键的角色&#xff0c;它不仅可以帮助门店管理客户信息和消费记录&#xff0c;还能够通过数据分析和营销功能提供个性化的服务和推广活动。下面看看连锁收银系统…