前言
今天來和小伙伴們分享下設(shè)計模式中的工廠模式啦
順便帶來了下面三個問題,一起來看看吧
一锥涕、工廠模式
我們都知道整慎,設(shè)計模式有23種慰于,按照功能和使用場景可以分為三大類:
- 創(chuàng)建型模式
- 結(jié)構(gòu)型模式
- 行為型模式
工廠設(shè)計模式(Factory Pattern)呢,就是一種很常見的設(shè)計模式何暮,屬于創(chuàng)建型模式的奄喂,主要作用就是來創(chuàng)建對象的~
原理圖
先來看一個小栗子
二、簡單工廠模式(非23種)
原理圖
例子的話海洼,感覺也挺多的 比如各種品牌的電腦呀跨新,手機呀,家具呀……
比如筆記本電腦的例子
抽取公共接口
這里就只提供一個返回品牌的接口
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.
當然是整,這個是最簡單的工廠模式例子了肖揣,也叫做 簡單工廠模式
當然這個也有很明顯的弊端,所以我們再來看看這個 工廠方法模式
三浮入、工廠方法模式
原理圖
想想簡單工廠的寫法龙优,將創(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.
是不是很簡單的就完成了這個工廠模式了
四彤断、抽象工廠模式
原理圖
那么工廠嘛,肯定不止一條生產(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)的
說到這里衅胀,你想到什么了呢岔乔?
不知道的話,就默念 Factory滚躯,F(xiàn)actory雏门,F(xiàn)actory …… 哈哈哈
是不是腦海中一下子浮現(xiàn)出來了這兩貨
BeanFactory
FactoryBean
從名字就可以看出這兩貨和工廠有關(guān) (分別通過 getBean
和 getObject
獲取對象)
那么我們先來介紹下他們叭
六、BeanFactory
源碼的第一句話
The root interface for accessing a Spring bean container. (IOC的根接口)
可以發(fā)現(xiàn)它是非常核心的組件掸掏。
遵循嚴格的生命周期
可以發(fā)現(xiàn)茁影,通過 BeanFactory
創(chuàng)建一個 Bean
要經(jīng)過非常嚴格的流程處理,很繁瑣丧凤。
方法
方法有很多募闲,比如 獲取別名呀,類型呀愿待,是否是單例蝇更,原型等
通過 getBean
去獲取對象
主要作用
根據(jù) BeanDefinition
生成相應(yīng)的 Bean
對象。
七呼盆、FactoryBean
源碼
可以發(fā)現(xiàn)就這么三個方法年扩,一個小工廠
通過 getObject
方法來返回一個對象
獲取對象時:
- 如果
beanName
沒有加&
號,則獲取的是泛型T 的對象访圃。 - 如果添加了
&
號厨幻,獲取的是實現(xiàn)了FactoryBean
接口本身的對象,如EhCacheFactoryBean
而正因為它的小巧腿时,它也被廣泛的應(yīng)用在Spring內(nèi)部况脆,以及Spring與第三方框架或組件的整合過程中。
八.BeanFactory 和 FactoryBean 的區(qū)別是什么批糟?
-
BeanFactory
是一個大工廠格了,是IOC容器的根基,有繁瑣的bean
生命周期處理過程徽鼎,可以生成出各種各樣的Bean
-
FactoryBean
是一個小工廠盛末,它自己也是一個Bean
弹惦,但是可以生成其他Bean
最后一個問題
九、Spring中工廠模式的使用
既然都和工廠有關(guān)悄但,那么我們就挑個軟柿子捏一下
FactoryBean工廠模式圖
可以發(fā)現(xiàn)和我們上面介紹的工廠方法模式一樣棠隐,公共接口和不同的實現(xiàn)類,通過具體的工廠獲取對象檐嚣。
BeanFactory
也是類似的助泽,就不畫啦
十、總結(jié)
畫個圖總結(jié)下啦