1. 程式人生 > 其它 >Spring中常見的設計模式—工廠模式

Spring中常見的設計模式—工廠模式

前言

今天來和小夥伴們分享下設計模式中的工廠模式

順便帶來了下面三個問題,一起來看看吧

一、工廠模式

我們都知道,設計模式有23種,按照功能和使用場景可以分為三大類:

  • 建立型模式
  • 結構型模式
  • 行為型模式

工廠設計模式(Factory Pattern)呢,就是一種很常見的設計模式,屬於建立型模式的,主要作用就是來建立物件的~

原理圖

先來看一個小栗子

二、簡單工廠模式(非23種)

原理圖

例子的話,感覺也挺多的 比如各種品牌的電腦呀,手機呀,傢俱呀……

比如膝上型電腦的例子

抽取公共介面

這裡就只提供一個返回品牌的介面

public interface ILaptop {
    String brand();
}1.2.3.

介面實現類

這裡就舉兩個例子~

public class HuaWeiLaptop implements ILaptop{
    @Override
    public String brand() {
        return "HuaWei";
    }
}
​
public class MacLaptop implements ILaptop {
    @Override
    public String brand() {
        return "Mac";
    }
}1.2.3.4.5.6.7.8.9.10.11.12.13.

工廠類

最主要的就是這個工廠類了,我們把建立物件的能力將給它~

public class LaptopFactory {
​
    public static ILaptop createLaptop(String brand){
        switch (brand){
            case "HuaWei":
                return new HuaWeiLaptop();
            case "Mac":
                return new MacLaptop();
            default:
                return null;
        }
    }
}1.2.3.4.5.6.7.8.9.10.11.12.13.

測試

就這樣,我們就簡單的完成了一個工廠模式的應用了~ ,以後建立物件就直接呼叫工廠的方法就可以了

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

當然,這個是最簡單的工廠模式例子了,也叫做 簡單工廠模式

當然這個也有很明顯的弊端,所以我們再來看看這個 工廠方法模式

三、工廠方法模式

原理圖

想想簡單工廠的寫法,將建立物件的所有操作都封裝在一個工廠裡,是不合理的,所以我們要進一步解耦

抽取工廠公共介面

public interface ILaptopFactory {
    ILaptop createLaptop();
}1.2.3.

工廠實現類

public class HuaweiLaptopFactory implements ILaptopFactory{
    @Override
    public ILaptop createLaptop() {
        return new HuaWeiLaptop();
    }
}1.2.3.4.5.6.

測試

簡單改動上面測試案例的前兩句程式碼即可

 HuaweiLaptopFactory huaweiLaptopFactory = new HuaweiLaptopFactory();
 ILaptop mac =  huaweiLaptopFactory.createLaptop();1.2.

是不是很簡單的就完成了這個工廠模式了

四、抽象工廠模式

原理圖

那麼工廠嘛,肯定不止一條生產線,它肯定有其他的業務,比如手機呀,其他電器啥的。

所以我們再重複上面筆記本產品的例子,再建一些其他類,然後也通過工廠類去建立它即可。

抽象工廠

先定義一個抽象工廠

public abstract class AbstractFactory {
    public abstract IPhone createPhone();
    public abstract ILaptop createLaptop();
}1.2.3.4.

工廠實現類

也就多了一個而已呀~

public class HuaweiFactory extends AbstractFactory{
    @Override
    public IPhone createPhone() {
        return new HuaWeiPhone();
    }
​
    @Override
    public ILaptop createLaptop() {
        return new HuaWeiLaptop();
    }
}1.2.3.4.5.6.7.8.9.10.11.

五、小結

在使用工廠模式時,我們可以發現從 簡單工廠(非23種) ——》 工廠方法 ——》抽象工廠

這是一個不斷擴充套件,解耦的過程,我們可以在專案種根據需要進行選擇~

比如 產品多的話就選抽象工廠,單一的話就直接用工廠或者簡單工廠就可以了

至此,我們瞭解到工廠模式是屬於23中設計模式中的建立型模式,主要用途就是建立物件,同時方便程式解耦。

接著,我們再來想想 Spring 中和工廠模式有關的

說到這裡,你想到什麼了呢?

不知道的話,就默唸 Factory,Factory,Factory …… 哈哈哈

是不是腦海中一下子浮現出來了這兩貨

  • BeanFactory
  • FactoryBean

從名字就可以看出這兩貨和工廠有關 (分別通過 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 也是類似的,就不畫啦

十、總結

畫個圖總結下啦