Spring中常見的設(shè)計模式—工廠模式

前言

今天來和小伙伴們分享下設(shè)計模式中的工廠模式

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

image

一锥涕、工廠模式

我們都知道整慎,設(shè)計模式有23種慰于,按照功能和使用場景可以分為三大類:

  • 創(chuàng)建型模式
  • 結(jié)構(gòu)型模式
  • 行為型模式

工廠設(shè)計模式(Factory Pattern)呢,就是一種很常見的設(shè)計模式何暮,屬于創(chuàng)建型模式的奄喂,主要作用就是來創(chuàng)建對象的~

原理圖

image

先來看一個小栗子

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

原理圖

image

例子的話海洼,感覺也挺多的 比如各種品牌的電腦呀跨新,手機呀,家具呀……

比如筆記本電腦的例子

抽取公共接口

這里就只提供一個返回品牌的接口

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

接口實現(xiàn)類

這里就舉兩個例子~

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.

工廠類

最主要的就是這個工廠類了坏逢,我們把創(chuàng)建對象的能力將給它~

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.

測試

就這樣域帐,我們就簡單的完成了一個工廠模式的應(yīng)用了~ ,以后創(chuàng)建對象就直接調(diào)用工廠的方法就可以了

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.

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

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

三浮入、工廠方法模式

原理圖

image

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

抽取工廠公共接口

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

工廠實現(xiàn)類

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.

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

四彤断、抽象工廠模式

原理圖

image

那么工廠嘛,肯定不止一條生產(chǎn)線易迹,它肯定有其他的業(yè)務(wù)瓦糟,比如手機呀,其他電器啥的赴蝇。

所以我們再重復(fù)上面筆記本產(chǎn)品的例子菩浙,再建一些其他類,然后也通過工廠類去創(chuàng)建它即可。

抽象工廠

先定義一個抽象工廠

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

工廠實現(xiàn)類

也就多了一個而已呀~

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.

五劲蜻、小結(jié)

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

這是一個不斷擴展,解耦的過程先嬉,我們可以在項目種根據(jù)需要進行選擇~

比如 產(chǎn)品多的話就選抽象工廠轧苫,單一的話就直接用工廠或者簡單工廠就可以了

至此,我們了解到工廠模式是屬于23中設(shè)計模式中的創(chuàng)建型模式疫蔓,主要用途就是創(chuàng)建對象,同時方便程序解耦含懊。

接著,我們再來想想 Spring 中和工廠模式有關(guān)的

image

說到這里衅胀,你想到什么了呢岔乔?

不知道的話,就默念 Factory滚躯,F(xiàn)actory雏门,F(xiàn)actory …… 哈哈哈

是不是腦海中一下子浮現(xiàn)出來了這兩貨

  • BeanFactory
  • FactoryBean

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

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

六、BeanFactory

源碼的第一句話

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

可以發(fā)現(xiàn)它是非常核心的組件掸掏。

遵循嚴格的生命周期

image

可以發(fā)現(xiàn)茁影,通過 BeanFactory 創(chuàng)建一個 Bean 要經(jīng)過非常嚴格的流程處理,很繁瑣丧凤。

方法

image

方法有很多募闲,比如 獲取別名呀,類型呀愿待,是否是單例蝇更,原型等

通過 getBean 去獲取對象

主要作用

根據(jù) BeanDefinition 生成相應(yīng)的 Bean 對象。

image

七呼盆、FactoryBean

源碼

可以發(fā)現(xiàn)就這么三個方法年扩,一個小工廠

image

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

獲取對象時:

  • 如果 beanName 沒有加 & 號,則獲取的是泛型T 的對象访圃。
  • 如果添加了 & 號厨幻,獲取的是實現(xiàn)了 FactoryBean 接口本身的對象,如 EhCacheFactoryBean

而正因為它的小巧腿时,它也被廣泛的應(yīng)用在Spring內(nèi)部况脆,以及Spring與第三方框架或組件的整合過程中。

八.BeanFactory 和 FactoryBean 的區(qū)別是什么批糟?

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

image

最后一個問題

九、Spring中工廠模式的使用

既然都和工廠有關(guān)悄但,那么我們就挑個軟柿子捏一下

FactoryBean工廠模式圖

image

可以發(fā)現(xiàn)和我們上面介紹的工廠方法模式一樣棠隐,公共接口和不同的實現(xiàn)類,通過具體的工廠獲取對象檐嚣。

BeanFactory 也是類似的助泽,就不畫啦

十、總結(jié)

畫個圖總結(jié)下啦

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚎京,一起剝皮案震驚了整個濱河市嗡贺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鞍帝,老刑警劉巖诫睬,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異膜眠,居然都是意外死亡,警方通過查閱死者的電腦和手機溜嗜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門宵膨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炸宵,你說我怎么就攤上這事辟躏。” “怎么了土全?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵捎琐,是天一觀的道長。 經(jīng)常有香客問我裹匙,道長瑞凑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任概页,我火速辦了婚禮籽御,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惰匙。我一直安慰自己技掏,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布项鬼。 她就那樣靜靜地躺著哑梳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绘盟。 梳的紋絲不亂的頭發(fā)上鸠真,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天悯仙,我揣著相機與錄音,去河邊找鬼弧哎。 笑死雁比,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的撤嫩。 我是一名探鬼主播偎捎,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼序攘!你這毒婦竟也來了茴她?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤程奠,失蹤者是張志新(化名)和其女友劉穎丈牢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞄沙,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡己沛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了距境。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片申尼。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖垫桂,靈堂內(nèi)的尸體忽然破棺而出师幕,到底是詐尸還是另有隱情,我是刑警寧澤诬滩,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布霹粥,位于F島的核電站,受9級特大地震影響疼鸟,放射性物質(zhì)發(fā)生泄漏后控。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一空镜、第九天 我趴在偏房一處隱蔽的房頂上張望忆蚀。 院中可真熱鬧,春花似錦姑裂、人聲如沸馋袜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欣鳖。三九已至,卻和暖如春茴厉,著一層夾襖步出監(jiān)牢的瞬間泽台,已是汗流浹背什荣。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怀酷,地道東北人稻爬。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蜕依,于是被迫代替她去往敵國和親桅锄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容