簡單工廠模式解釋:
簡單工廠模式(Simple Factory Pattern)屬于類的創(chuàng)新型模式蚤氏,又叫靜態(tài)工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個(gè)類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例呛每,被創(chuàng)建的實(shí)例通常都具有共同的父類昧绣。
簡單工廠模式的角色分布以及各角色的職責(zé):
工廠角色(Creator):這是簡單工廠模式的核心,由它負(fù)責(zé)創(chuàng)建所有的類的內(nèi)部邏輯。當(dāng)然工廠類必須能夠被外界調(diào)用,創(chuàng)建所需要的產(chǎn)品對象。(這個(gè)其實(shí)就是一個(gè)普通類无午,里面提供一個(gè)創(chuàng)建其他類的方法)
抽象(Product)產(chǎn)品角色:簡單工廠模式所創(chuàng)建的所有對象的父類,注意祝谚,這里的父類可以是接口也可以是抽象類宪迟,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。(說一大堆交惯,其實(shí)就是具體產(chǎn)品的父類)
具體產(chǎn)品(Concrete Product)角色:簡單工廠所創(chuàng)建的具體實(shí)例對象次泽,這些具體的產(chǎn)品往往都擁有共同的父類。(其實(shí)就是子類)
看看具體代碼就知道了:
1 抽象產(chǎn)品角色(即父類)
packagecom.diermeng.designPattern.SimpleFactory;
/*
* 產(chǎn)品的抽象接口
*/
public?interfaceFood {
/*
* 獲得相應(yīng)的食物
*/
public?voidget();
}
2 具體產(chǎn)品(即子類)
接下來建立具體的產(chǎn)品:麥香雞和薯?xiàng)l
packagecom.diermeng.designPattern.SimpleFactory.impl;
importcom.diermeng.designPattern.SimpleFactory.Food;
/*
* 麥香雞對抽象產(chǎn)品接口的實(shí)現(xiàn)
*/
public?classMcChickenimplementsFood{
/*
* 獲取一份麥香雞
*/
public?voidget(){
System.out.println("我要一份麥香雞");
}
}
packagecom.diermeng.designPattern.SimpleFactory.impl;
importcom.diermeng.designPattern.SimpleFactory.Food;
/*
* 薯?xiàng)l對抽象產(chǎn)品接口的實(shí)現(xiàn)
*/
public?classChipsimplementsFood{
/*
* 獲取一份薯?xiàng)l
*/
public?voidget(){
System.out.println("我要一份薯?xiàng)l");
}
}
3 工廠角色(即普通類提供了創(chuàng)建其他類的方法)
現(xiàn)在建立一個(gè)食物加工工廠:
packagecom.diermeng.designPattern.SimpleFactory.impl;
importcom.diermeng.designPattern.SimpleFactory.Food;
public?classFoodFactory {
public?staticFood getFood(String type)throwsInstantiationException, IllegalAccessException, ClassNotFoundException {
if(type.equalsIgnoreCase("mcchicken")) {
returnMcChicken.class.newInstance();
}else?if(type.equalsIgnoreCase("chips")) {
returnChips.class.newInstance();
}else{
System.out.println("哎呀席爽!找不到相應(yīng)的實(shí)例化類啦意荤!");
return?null;
}
}
}
4,用法
最后我們建立測試客戶端:
packagecom.diermeng.designPattern.SimpleFactory.client;
importcom.diermeng.designPattern.SimpleFactory.Food;
importcom.diermeng.designPattern.SimpleFactory.impl.FoodFactory;
/*
* 測試客戶端
*/
public?classSimpleFactoryTest {
public?static?voidmain(String[] args)throwsInstantiationException, IllegalAccessException, ClassNotFoundException {
//實(shí)例化各種食物
Food mcChicken = FoodFactory.getFood("McChicken");
Food chips = FoodFactory.getFood("Chips");
Food eggs = FoodFactory.getFood("Eggs");
//獲取食物
if(mcChicken!=null){
mcChicken.get();
}
if(chips!=null){
chips.get();
}
if(eggs!=null){
eggs.get();
}
}
}
簡單工廠模式的優(yōu)缺點(diǎn)分析:
優(yōu)點(diǎn):工廠類是整個(gè)模式的關(guān)鍵所在只锻。它包含必要的判斷邏輯玖像,能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對象齐饮。用戶在使用時(shí)可以直接根據(jù)工廠類去創(chuàng)建所需的實(shí)例御铃,而無需了解這些對象是如何創(chuàng)建以及如何組織的。有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化沈矿。
缺點(diǎn):由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,這就直接導(dǎo)致一旦這個(gè)工廠出了問題咬腋,所有的客戶端都會受到牽連羹膳;而且由于簡單工廠模式的產(chǎn)品室基于一個(gè)共同的抽象類或者接口,這樣一來根竿,但產(chǎn)品的種類增加的時(shí)候陵像,即有不同的產(chǎn)品接口或者抽象類的時(shí)候,工廠類就需要判斷何時(shí)創(chuàng)建何種種類的產(chǎn)品寇壳,這就和創(chuàng)建何種種類產(chǎn)品的產(chǎn)品相互混淆在了一起醒颖,違背了單一職責(zé),導(dǎo)致系統(tǒng)喪失靈活性和可維護(hù)性壳炎。而且更重要的是泞歉,簡單工廠模式違背了“開放封閉原則”,就是違背了“系統(tǒng)對擴(kuò)展開放,對修改關(guān)閉”的原則腰耙,因?yàn)楫?dāng)我新增加一個(gè)產(chǎn)品的時(shí)候必須修改工廠類榛丢,相應(yīng)的工廠類就需要重新編譯一遍。
總結(jié)一下:簡單工廠模式分離產(chǎn)品的創(chuàng)建者和消費(fèi)者挺庞,有利于軟件系統(tǒng)結(jié)構(gòu)的優(yōu)化晰赞;但是由于一切邏輯都集中在一個(gè)工廠類中,導(dǎo)致了沒有很高的內(nèi)聚性选侨,同時(shí)也違背了“開放封閉原則”掖鱼。另外,簡單工廠模式的方法一般都是靜態(tài)的援制,而靜態(tài)工廠方法是無法讓子類繼承的戏挡,因此,簡單工廠模式無法形成基于基類的繼承樹結(jié)構(gòu)隘谣。
uml圖片
在實(shí)際的的使用中增拥,抽閑產(chǎn)品和具體產(chǎn)品之間往往是多層次的產(chǎn)品結(jié)構(gòu),如下圖所示: