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

 前言

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

顺便带来了下面三个问题,一块儿来看看吧框架

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

一.工厂模式

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

  • 建立型模式
  • 结构型模式
  • 行为型模式

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

原理图

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

先来看一个小栗子spa

二.简单工厂模式(非23种)

原理图

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

例子的话,感受也挺多的 好比各类品牌的电脑呀,手机呀,家具呀……设计

好比笔记本电脑的例子code

抽取公共接口

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

public interface ILaptop {
    String brand();
}

接口实现类

这里就举两个例子~blog

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);
    }
}

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

固然这个也有很明显的弊端,因此咱们再来看看这个 工厂方法模式

三.工厂方法模式

原理图

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

想一想简单工厂的写法,将建立对象的全部操做都封装在一个工厂里,是不合理的,因此咱们要进一步解耦

抽取工厂公共接口

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

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

四.抽象工厂模式

原理图

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

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

因此咱们再重复上面笔记本产品的例子,再建一些其余类,而后也经过工厂类去建立它便可。

抽象工厂

先定义一个抽象工厂

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 中和工厂模式有关的

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

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


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

是否是脑海中一会儿浮现出来了这两货

  • BeanFactory 
  • FactoryBean

从名字就能够看出这两货和工厂有关 (分别经过 getBeangetObject 获取对象)

那么咱们先来介绍下他们叭

六.BeanFactory

源码的第一句话

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

能够发现它是很是核心的组件

遵循严格的生命周期

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

能够发现,经过 BeanFactory 建立一个 Bean 要通过很是严格的流程处理,很繁琐。

方法

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

方法有不少,好比 获取别名呀,类型呀,是不是单例,原型等

经过 getBean 去获取对象

主要做用

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

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

七.FactoryBean

源码

能够发现就这么三个方法,一个小工厂

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

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

获取对象时:

  • 若是 beanName 没有加 & 号,则获取的是泛型T 的对象。
  • 若是添加了 & 号,获取的是实现了 FactoryBean 接口自己的对象,如 EhCacheFactoryBean

而正由于它的小巧,它也被普遍的应用在Spring内部,以及Spring与第三方框架或组件的整合过程当中。

八.BeanFactory 和 FactoryBean 的区别是什么?
  • BeanFactory 是一个大工厂,是IOC容器的根基,有繁琐的 bean 生命周期处理过程,能够生成出各类各样的 Bean
  • FactoryBean 是一个小工厂,它本身也是一个 Bean ,可是能够生成其余 Bean

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

最后一个问题

九.Spring中工厂模式的使用

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

FactoryBean工厂模式图

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

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

BeanFactory 也是相似的,就不画啦

十.总结

画个图总结下啦

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 

相关文章
相关标签/搜索