三分鐘快速瞭解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=

 

相關文章
相關標籤/搜索