三分钟快速了解Spring中的工厂模式

简介: 前言今天4ye来和小伙伴们分享下设计模式中的工厂模式啦😄顺便带来了下面三个问题,一起来看看叭😋一.工厂模式我们都知道,设计模式有23种,按照功能和使用场景可以分为三大类:• 创建型模式• 结构型模式• 行为型模式工厂设计模式(Factory Pattern)呢,就是一种很常见的设计模式,属于创建型模式的,主要作用就是来创建对象的~

网络异常,图片无法展示
|




前言


今天4ye来和小伙伴们分享下设计模式中的工厂模式啦😄


顺便带来了下面三个问题,一起来看看叭😋


网络异常,图片无法展示
|


一.工厂模式


我们都知道,设计模式有23种,按照功能和使用场景可以分为三大类:


  • 创建型模式


  • 结构型模式


  • 行为型模式


工厂设计模式(Factory Pattern)呢,就是一种很常见的设计模式,属于创建型模式的,主要作用就是来创建对象的~


原理图

网络异常,图片无法展示
|


先来看一个小例子叭😄


简单工厂模式(非23种)


原理图


网络异常,图片无法展示
|


例子的话,感觉也挺多的 比如各种品牌的电脑呀,手机呀,家具呀……


比如笔记本电脑的例子


抽取公共接口


这里就只提供一个返回品牌的接口


public interface ILaptop {
    String brand();
}
复制代码


接口实现类


这里就举两个例子~


public class HuaWeiLaptop implements ILaptop{
    @Override
    public String brand() {
        return "HuaWei";
    }
}
public class MacLaptop implements ILaptop {
    @Override
    public String brand() {
        return "Mac";
    }
}
复制代码


工厂类


最主要的就是这个工厂类了,我们把创建对象的能力将给它~


public class LaptopFactory {
    public static ILaptop createLaptop(String brand){
        switch (brand){
            case "HuaWei":
                return new HuaWeiLaptop();
            case "Mac":
                return new MacLaptop();
            default:
                return null;
        }
    }
}
复制代码


测试


就这样,我们就简单的完成了一个工厂模式的应用了~ ,以后创建对象就直接调用工厂的方法就可以了🐖


public class LaptopMain {
    public static void main(String[] args) {
        ILaptop hw = LaptopFactory.createLaptop("HuaWei");
        String brand = hw.brand();
        System.out.println(brand);
    }
}
复制代码


当然,这个是最简单的工厂模式例子了,也叫做 简单工厂模式


当然这个也有很明显的弊端,所以我们再来看看这个 工厂方法模式


工厂方法模式


原理图


网络异常,图片无法展示
|


想想简单工厂的写法,将创建对象的所有操作都封装在一个工厂里,是不合理的,所以我们要进一步解耦


抽取工厂公共接口


public interface ILaptopFactory {
    ILaptop createLaptop();
}
复制代码


工厂实现类


public class HuaweiLaptopFactory implements ILaptopFactory{
    @Override
    public ILaptop createLaptop() {
        return new HuaWeiLaptop();
    }
}
复制代码


测试


简单改动上面测试案例的前两句代码即可


HuaweiLaptopFactory huaweiLaptopFactory = new HuaweiLaptopFactory();
 ILaptop mac =  huaweiLaptopFactory.createLaptop();
复制代码


是不是很简单的就完成了这个工厂模式了😄


抽象工厂模式


原理图


网络异常,图片无法展示
|


那么工厂嘛,肯定不止一条生产线,它肯定有其他的业务,比如手机呀,其他电器啥的。


所以我们再重复上面笔记本产品的例子,再建一些其他类,然后也通过工厂类去创建它即可。


抽象工厂


先定义一个抽象工厂


public abstract class AbstractFactory {
    public abstract IPhone createPhone();
    public abstract ILaptop createLaptop();
}
复制代码


工厂实现类


也就多了一个而已呀~


public class HuaweiFactory extends AbstractFactory{
    @Override
    public IPhone createPhone() {
        return new HuaWeiPhone();
    }
    @Override
    public ILaptop createLaptop() {
        return new HuaWeiLaptop();
    }
}
复制代码


小结


在使用工厂模式时,我们可以发现从 简单工厂(非23种) ——》 工厂方法 ——》抽象工厂


这是一个不断扩展,解耦的过程,我们可以在项目种根据需要进行选择~


比如 产品多的话就选抽象工厂,单一的话就直接用工厂或者简单工厂就可以了😝


\


网络异常,图片无法展示
|


至此,我们了解到工厂模式是属于23中设计模式中的创建型模式,主要用途就是创建对象,同时方便程序解耦。


接着,我们再来想想 Spring 中和工厂模式有关的🐷


网络异常,图片无法展示
|


说到这里,你想到什么了呢?😄


不知道的话,就默念 Factory,Factory,Factory …… 哈哈哈


是不是脑海中一下子浮现出来了这两货👉 BeanFactoryFactoryBean


从名字就可以看出这两货和工厂有关 哈哈(分别通过 getBeangetObject 获取对象)


那么我们先来介绍下他们叭😄


BeanFactory


源码的第一句话👇


The root interface for accessing a Spring bean container. (IOC的根接口)


可以发现它是非常核心的组件


遵循严格的生命周期👇


网络异常,图片无法展示
|


可以发现,通过 BeanFactory 创建一个 Bean 要经过非常严格的流程处理,很繁琐。


方法


网络异常,图片无法展示
|


方法有很多,比如 获取别名呀,类型呀,是否是单例,原型等

通过 getBean 去获取对象


主要作用


根据 BeanDefinition 生成相应的 Bean 对象。


网络异常,图片无法展示
|


FactoryBean


源码


可以发现就这么三个方法,一个小工厂~


网络异常,图片无法展示
|


通过 getObject 方法来返回一个对象


获取对象时:


  • 如果 beanName 没有加 & 号,则获取的是泛型T 的对象。


  • 如果添加了 & 号,获取的是实现了 FactoryBean 接口本身的对象,如 EhCacheFactoryBean


而正因为它的小巧,它也被广泛的应用在Spring内部,以及Spring与第三方框架或组件的整合过程中。


三.BeanFactory 和 FactoryBean 的区别是什么?


  • BeanFactory 是一个大工厂,是IOC容器的根基,有繁琐的 bean 生命周期处理过程,可以生成出各种各样的 Bean


  • FactoryBean 是一个小工厂,它自己也是一个 Bean ,但是可以生成其他 Bean



网络异常,图片无法展示
|


最后一个问题~😄


二.Spring中工厂模式的使用


既然都和工厂有关,那么我们就挑个软柿子捏一下叭😄

网络异常,图片无法展示
|


FactoryBean工厂模式图


网络异常,图片无法展示
|


可以发现和我们上面介绍的工厂方法模式一样,公共接口和不同的实现类,通过具体的工厂获取对象。


BeanFactory 也是类似的,就不画啦


总结


画个图总结下啦👇


网络异常,图片无法展示
|



目录
相关文章
|
设计模式 前端开发 Java
【Spring】工厂模式
【Spring】工厂模式
|
前端开发 JavaScript Java
浅谈Spring的相关概念性问题 IOC DI AOP 工厂模式 单例
浅谈Spring的相关概念性问题 IOC DI AOP 工厂模式 单例
142 0
|
设计模式 Java Spring
java spring设计模式 之 工厂模式
java spring设计模式 之 工厂模式
|
SQL 人工智能 Java
Spring中使用工厂模式解耦详解
Spring中使用工厂模式解耦详解
|
设计模式 缓存 Java
使用Spring的BeanPostProcessor优雅的实现工厂模式
使用Spring的BeanPostProcessor优雅的实现工厂模式
|
Java vr&ar Spring
源码专题之spring设计模式:委派模式、工厂模式
委派模式 在常见的23种设计模式中其实并没有委派模式的影子,但是委派模式确实是spring中应用比较多的一种,SpringMVC框架中的DispatcherServlet就是用到了这种模式。下面以项目经理和普通员工的模型来实现一个简单的委派模式。
4249 0
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
27天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
141 2
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
27天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
47 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块