Spring结合工厂模式

news2024/11/13 4:16:04

学习设计模式,不要进入一个误区生搬硬套,它是一种编程思想,结合实际使用,往往设计模式是混合使用的

工厂模式

核心本质:使用工厂统一管理对象的创建,将调用者跟实现类解耦

  我这里使用Spring容器的支持,实现起来将更加简单,只需要实现产品接口,就能产品就能自动注册到工厂,让工厂统一管理。以后有新的产品,不修改原来的代码,新产品实现产品接口,专注新产品的业务功能开发即可。

package com.dj.factory;

/**
 * User: ldj
 * Date: 2024/1/28
 * Time: 13:38
 * Description: 产品类
 */
public interface Animal {

    void description();
}


@Component
public class Cat implements Animal {

    @Override
    public void description() {
        System.out.println("我是一只可爱的喵星人");
    }
}


@Component
public class Dog implements Animal {

    @Override
    public void description() {
        System.out.println("我是一只爱拆家的二哈");
    }
}
package com.dj.factory;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * User: ldj
 * Date: 2024/1/28
 * Time: 13:11
 * Description: 工厂类
 */
@Component
public class AnimalFactory implements ApplicationContextAware {

    private static final Map<String, Animal> animalMap = new ConcurrentHashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        register(applicationContext);
    }

    public static Animal getInstance(String beanName) {
        return animalMap.get(beanName);
    }

    public static void register(ApplicationContext applicationContext) {
        Map<String, Animal> beanMap = applicationContext.getBeansOfType(Animal.class);
        if (!CollectionUtils.isEmpty(beanMap)) {
            animalMap.putAll(beanMap);
        }
    }
}

其实注册这个动作还可以在产品类实现接口 InitializingBean 在重写方法进行注入类似这样:

 还可以使用 @PostConstruct 自己写init方法,在init方法方法里调用工厂提供的注入方法

那么问题来了,有Spring容器管理的Animal的实现类我们还要必要自己写工厂类吗?于是继续优化代码:

package com.dj.factory;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * User: ldj
 * Date: 2024/1/28
 * Time: 13:11
 * Description: 工厂类
 */
@Component
public class AnimalFactory implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        AnimalFactory.applicationContext = applicationContext;
    }

    public static Animal getInstance(String beanName) {
        return (Animal) applicationContext.getBean(beanName);
    }

}

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

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

相关文章

【C项目】顺序表

简介&#xff1a;本系列博客为C项目系列内容&#xff0c;通过代码来具体实现某个经典简单项目 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…

k8s的operator基石:controller-runtime源码解析

写在之前 今天开始开更controller-runtime的源码阅读&#xff0c;笔者建议大家在阅读前了解以下知识&#xff0c;可能会帮助大家更好的理解源码逻辑。 1.client-go的基础使用 2. 使用kubebuilder搭建一个简单的controller-runtime环境 3.informer的基本思想 1.源码环境搭建 参…

UE5/UE4中3D汉字字体文字的创建与实现

本案例工程下载位置&#xff1a;https://mbd.pub/o/bread/ZZqVmJ9v 在虚幻引擎5&#xff08;UE5&#xff09;和虚幻引擎4&#xff08;UE4&#xff09;中&#xff0c;实现3D汉字字体的创建是一项常见的需求。 本文将详细介绍两种有效的方法&#xff1a; 1.通过TextRender配合Of…

【javase】——类和对象

莫道桑榆晚&#xff0c;为霞尚满天。文章目录 面向对象的初步认识面向对象与面向过程什么是面向对象 类的定义和使用类的定义格式 类的实例化什么是实例化类和对象的使用 this引用什么是this引用this 引用的特性。 对象的构造以及初始化如何初始化对象构造方法首先第一&#xf…

Win10如何开启适用于 Linux 的 Windows 子系统WSL

环境&#xff1a; Win10专业版19041 问题描述&#xff1a; Win10如何开启适用于 Linux 的 Windows 子系统 什么是适用于 Linux 的 Windows 子系统 (WSL)&#xff1f;适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 操作系统的一项功能&#xff0c;通过它可以直接在 Wind…

常用芯片学习——ULIN2803芯片

ULIN2803 高压大电流达林顿晶体管阵列 使用说明 ULN2803为高压大电流达林顿晶体管阵列&#xff0c;每个阵列包含7 个集电极开路共发射极对。每对的额定电流为500mA。抑制包括用于感性负载驱动的二极管&#xff0c;输入和输出是相反的。这些器件能够驱动宽范围的负载范围&…

2024.1.30 GNSS 学习笔记

站星双差Kalman滤波伪距差分定位流程 1. RTK定位技术&#xff08;实时载波相位差分技术&#xff09;原理-站间单差浮点解 1.RTK技术其实就是在RTD技术的基础上增加载波观测值的使用。由于伪距的噪声在分米量级&#xff0c;即使我们通过站间单差消除了绝大部分的误差影响&…

对于this.$nextTick代码的理解

我们都知道DOM的更新是异步的,Vue的绑定原理就是用数据区驱动视图,视图也能驱动数据&#xff0c;两者是双向绑定的。 如何立马获取到更新之后的DOM呢&#xff1f; 可以使用: <template><div class"" ref"aa">{{ a }}<button click"f…

openssl3.2 - .pod文件的查看方法

文章目录 .pod文件的查看方法概述笔记初步的解决方法备注 - pod2html.bat的详细用法好像Perl就自带这个BATEND .pod文件的查看方法 概述 看到openssl源码目录下有很多.pod文件, 软件发布的帮助内容都在里面. 当make install后, 大部分的.pod都会转成html文件, 但是有一部分…

DSP系统时钟总结

一、stm32中断偏移向量介绍 1.1 为什么要设置中断向量偏移 上图可以看出程序上电先进入0x08000000开始运行&#xff0c;紧接着执行复位中断向量&#xff0c;然后执行复位中断程序&#xff0c;然后进入main函数。 如果想要app的中断正常运行&#xff0c;那就必须手动设置中断向…

【读点论文】SPTS Single-Point Text Spotting

SPTS Single-Point Text Spotting ABSTRACT 现有的场景文本识别(即&#xff0c;端到端文本检测和识别)方法依赖于昂贵的边界框注释(例如&#xff0c;文本行&#xff0c;词级或字符级边界框)。我们首次证明&#xff0c;训练场景文本识别模型可以通过对每个实例的单点进行极低成…

推特账号被冻结怎么办?检查IP是否正常

Twitter 拥有庞大的用户群和日常内容流&#xff0c;是沟通、网络和营销的重要平台。然而&#xff0c;处理其限制和潜在的帐户问题可能很棘手。有许多跨境社媒小伙伴反馈&#xff0c;账号无故被冻结&#xff0c;导致内容与客户尽失&#xff01;其实除了账户养号、被举报、广告信…

C语言基础13

今天是学习嵌入式相关内容的第十四天&#xff0c;以下是今日所学内容 1.结构体: 1.结构体类型定义 2.结构体变量的定义 3.结构体元素的访问 4.结构体的存储 内存对齐 结构体整体的大小必须为最大基本类型长度的整数倍 5.结构体作为函数参数 值传递 练习:定…

freeRTOS的第一个任务是如何跑起来的?(以RISC-V架构分析)

1、前言 要理解第一个任务是如何跑起来&#xff0c;必须先能理解下面的概念 freeRTOS的任务创建、任务切换机制架构规定的函数调用规范了解基础的汇编指令 可以参考的资料&#xff1a; 《freertos任务切换的现场保存、恢复&#xff08;任务栈空间&#xff09;深度分析&#xf…

Arduino开发实例-DRV8833电机驱动器控制直流电机

DRV8833电机驱动器控制直流电机 文章目录 DRV8833电机驱动器控制直流电机1、DRV8833电机驱动器介绍2、硬件接线图3、代码实现DRV8833 使用 MOSFET,而不是 BJT。 MOSFET 的压降几乎可以忽略不计,这意味着几乎所有来自电源的电压都会传递到电机。 这就是为什么 DRV8833 不仅比基…

【Matplotlib】科研绘图——折线图

文章目录 1、导入2、定义Font及Style3、设置图像大小及坐标刻度4、数据准备5、自定义draw6、其他设置7、效果图 1、导入 import matplotlib import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages import numpy as np import pandas as pd %…

合肥工业大学计算机试卷和笔记

总结了一些试卷和笔记&#xff0c;但是csdn上不方便上传pdf&#xff0c;所以上传到github了&#xff0c;欢迎Issue和fork 地址&#xff1a; https://github.com/Martin-share/hfut-cs-final-exams-and-note 持续更新-------2024-01-30

企业做新媒体矩阵不可忽视的四大问题

互联网进入下半场&#xff0c;存量市场竞争日益加剧&#xff0c;获客成本不断增加&#xff0c;越来越多的品牌开始数字化转型&#xff0c;而布局社交媒体矩阵则成为了大多数品牌的必然选择。 通过社交媒体的图文、短视频、直播等形式营销推广&#xff0c;不断做深、做透、做细&…

如何override已经存在的约束

文章目录 前言一、如何override已经存在的约束总结 前言 在验证过程中&#xff0c;我们基本都是基于spec&#xff0c;做正常的约束&#xff0c;当我们测特定corner场景的时候&#xff0c;希望能够用新的约束&#xff0c;去override已经存在的约束。 一、如何override已经存在的…

windows下postgresql的安装使用

一、安装 1、安装包安装 1.1 下载exe安装包 选择安装包&#xff1a;官网 或者点击下载&#xff1a;postgresql-12.12-1-windows-x64.exe Tip&#xff1a;此时若报错&#xff1a;There has been an error.An error occured executing the Microsoft VC runtime installer。 参…