java和python的區別「java工廠設計模式詳解」

前言

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

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

一、工廠模式

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

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

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

原理圖

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

先來看一個小栗子

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

原理圖

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

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

比如筆記本電腦的例子

抽取公共介面

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

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.

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

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

三、工廠方法模式

原理圖

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

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

抽取工廠公共介面

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.

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

四、抽象工廠模式

原理圖

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

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

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

抽象工廠

先定義一個抽象工廠

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

從名字就可以看出這兩貨和工廠有關 (分別通過 getBean 和 getObject 獲取對象)

那麼我們先來介紹下他們叭

六、BeanFactory

源碼的第一句話

The root interface for accessing a Spring bean container. (IOC的根介面)

可以發現它是非常核心的組件

遵循嚴格的生命周期

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

可以發現,通過 BeanFactory 創建一個 Bean 要經過非常嚴格的流程處理,很繁瑣。

方法

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

方法有很多,比如 獲取別名呀,類型呀,是否是單例,原型等

通過 getBean 去獲取對象

主要作用

根據 BeanDefinition 生成相應的 Bean 對象。

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

七、FactoryBean

源碼

可以發現就這麼三個方法,一個小工廠

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

通過 getObject 方法來返回一個對象

獲取對象時:

  • 如果 beanName 沒有加 & 號,則獲取的是泛型T 的對象。
  • 如果添加了 & 號,獲取的是實現了 FactoryBean 介面本身的對象,如 EhCacheFactoryBean

而正因為它的小巧,它也被廣泛的應用在Spring內部,以及Spring與第三方框架或組件的整合過程中。

八、BeanFactory 和 FactoryBean 的區別是什麼?

  • BeanFactory 是一個大工廠,是IOC容器的根基,有繁瑣的 bean 生命周期處理過程,可以生成出各種各樣的 Bean
  • FactoryBean 是一個小工廠,它自己也是一個 Bean ,但是可以生成其他 Bean​

最後一個問題

九、Spring中工廠模式的使用

既然都和工廠有關,那麼我們就挑個軟柿子捏一下

FactoryBean工廠模式圖

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

可以發現和我們上面介紹的工廠方法模式一樣,公共介面和不同的實現類,通過具體的工廠獲取對象。

BeanFactory 也是類似的,就不畫啦

十、總結

畫個圖總結下啦

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

最後

Spring相關資料:

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

Spring筆記-176頁的知識核心整理

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

另外還整理成了40多套PDF文檔:全套的Java面試寶典手冊,「性能調優+微服務架構+並發編程+開源框架+分散式」等七大面試專欄,包含Tomcat、JVM、MySQL、SpringCloud、SpringBoot、Dubbo、並發、Spring、SpringMVC、MyBatis、Zookeeper、Ngnix、Kafka、MQ、Redis、MongoDB、memcached等等。如果你對這個感興趣,小編可以免費分享。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/207844.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-08 14:40
下一篇 2024-12-08 14:40

相關推薦

發表回復

登錄後才能評論