應(yīng)用場(chǎng)景
簡(jiǎn)單工廠模式又叫做靜態(tài)工廠方法(StaticFactoryMethod)模式馒索,但不屬于23種設(shè)計(jì)模式之一曹体。簡(jiǎn)單工廠模式的實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù)嫌吠,動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類匾竿。
Spring中的BeanFactory就是簡(jiǎn)單工廠模式的體現(xiàn)砌烁,根據(jù)傳入一個(gè)唯一的標(biāo)識(shí)來獲得Bean對(duì)象,但是否是在傳入?yún)?shù)后創(chuàng)建還是傳入?yún)?shù)前創(chuàng)建這個(gè)要根據(jù)具體情況來定姑原。
歸類
創(chuàng)建型模式
特點(diǎn)
是復(fù)雜工廠模式的思維模型
窮舉
批量生產(chǎn)悬而、標(biāo)準(zhǔn)化
簡(jiǎn)單工廠模式定義
簡(jiǎn)單工廠模式(Simple Factory Pattern):定義一個(gè)工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例页衙,被創(chuàng)建的實(shí)例通常都具有共同的父類摊滔。因?yàn)樵诤?jiǎn)單工廠模式中用于創(chuàng)建實(shí)例的方法是靜態(tài)(static)方法,因此簡(jiǎn)單工廠模式又被稱為靜態(tài)工廠方法(Static Factory Method)模式店乐,它屬于類創(chuàng)建型模式。
簡(jiǎn)單工廠模式結(jié)構(gòu)圖
從簡(jiǎn)單工廠結(jié)構(gòu)圖中我們可以看出它包含三個(gè)角色:
- Product (抽象產(chǎn)品角色):
它是工廠類所創(chuàng)建的所有對(duì)象的父類呻袭,封裝了各種產(chǎn)品對(duì)象的公有方法眨八,它的引入將提高系統(tǒng)的靈活性,使得在工廠類中只需定義一個(gè)通用的工廠方法左电,因?yàn)樗袆?chuàng)建的具體產(chǎn)品對(duì)象都是其子類對(duì)象廉侧。抽象產(chǎn)品可以使用接口和抽象類來來實(shí)現(xiàn)。
- ConcreteProduct (具體產(chǎn)品角色):
它是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)篓足,所有被創(chuàng)建的對(duì)象都充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例段誊。每一個(gè)具體產(chǎn)品角色都繼承了抽象產(chǎn)品角色,需要實(shí)現(xiàn)在抽象產(chǎn)品中聲明的抽象方法栈拖。在簡(jiǎn)單工廠模式中连舍,客戶端通過工廠類來創(chuàng)建一個(gè)產(chǎn)品類的實(shí)例,而無須直接使用new關(guān)鍵字來創(chuàng)建對(duì)象涩哟,它是工廠模式家族中最簡(jiǎn)單的一員索赏。 在使用簡(jiǎn)單工廠模式時(shí),首先需要對(duì)產(chǎn)品類進(jìn)行重構(gòu)贴彼,不能設(shè)計(jì)一個(gè)包羅萬象的產(chǎn)品類潜腻,而需根據(jù)實(shí)際情況設(shè)計(jì)一個(gè)產(chǎn)品層次結(jié)構(gòu),將所有產(chǎn)品類公共的代碼移至抽象產(chǎn)品類器仗,并在抽象產(chǎn)品類中聲明一些抽象方法融涣,以供不同的具體產(chǎn)品類來實(shí)現(xiàn)。
- Factory (工廠角色):
這個(gè)角色就是工廠類,他是工廠模式的核心威鹿,負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有產(chǎn)品實(shí)例的內(nèi)部邏輯妓盲;工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對(duì)象专普;在工廠類中提供了靜態(tài)的工廠方法factoryMethod()悯衬,它的返回類型為抽象產(chǎn)品類型Product。
簡(jiǎn)單工廠舉例
比如我有蘋果檀夹、桔子筋粗、等水果,然后有一個(gè)榨汁機(jī)炸渡,我給一個(gè)蘋果就給我榨出蘋果汁娜亿,給桔子就出桔汁。
在這個(gè)例子中蚌堵,果汁就是我們的產(chǎn)品买决,而蘋果汁,桔子汁就是我們的具體的產(chǎn)品吼畏,榨汁機(jī)就是我們的工廠,而蘋果督赤,桔子等水果就是我們輸送的原材料.
榨汁機(jī)工廠的 UML 圖
1、定義抽象產(chǎn)品果汁接口
IJuice.java
/**
* @Description 創(chuàng)建一個(gè)果汁接口
*/
public interface IJuice {
String getName() ;
//也可以聲明一些其它的業(yè)務(wù)方法
}
2泻蚊、定義具體的產(chǎn)品躲舌,蘋果汁「AppleJuice.java
」,桔汁「OrangeJuice.java
」
# AppleJuice.java
/**
* @Description 一個(gè)具體的產(chǎn)品--- 蘋果汁
*/
public class AppleJuice implements IJuice {
public static final String TAG = "AppleJuice" ;
@Override
public String getName() {
Log.e(TAG,"我是蘋果汁") ;
return "我是蘋果汁";
}
}
# OrangeJuice.java
/**
* @Description 具體的產(chǎn)品桔子汁
*/
public class OrangeJuice implements IJuice {
public static final String TAG = "OrangeJuice" ;
@Override
public String getName() {
Log.e(TAG,"我是桔子汁") ;
return "我是桔子汁";
}
}
3性雄、創(chuàng)建榨汁機(jī)「工廠類」 JuiceFactory.java
/**
* @Description 果汁機(jī)---工廠
*/
public class JuiceFactory {
/**
* 根據(jù)名稱來生產(chǎn)不同的果汁
* @param name
* @return
*/
public static IJuice createJuice(String name){
IJuice iJuice = null;
if(name.equals("apple")){
//蘋果汁
iJuice = new AppleJuice() ;
}else if(name.equals("orange")){
//桔子汁
iJuice = new OrangeJuice() ;
}
return iJuice ;
}
}
4没卸、使用
public String create(int type) {
IJuice juice = null;
switch (type){
case 1:
juice = JuiceFactory.createJuice("apple") ;
break ;
case 2:
juice = JuiceFactory.createJuice("orange") ;
break ;
default:
break ;
}
return juice .getName();
}
public static void main(String[] args) {
String name = create(1);
System.out.println(name);
}
簡(jiǎn)單工廠模式的優(yōu)點(diǎn)
- 工廠類含有必要的判斷邏輯,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例秒旋,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任约计,客戶程序不需要產(chǎn)品的具體生產(chǎn)細(xì)節(jié);簡(jiǎn)單工廠模式通過這種做法實(shí)現(xiàn)了對(duì)責(zé)任的分割迁筛,它提供了專門的工廠類用于創(chuàng)建對(duì)象煤蚌。
- 客戶端無須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對(duì)應(yīng)的參數(shù)即可瑰煎,不需要知道產(chǎn)品是怎么創(chuàng)建的铺然。
- 通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類酒甸,在一定程度上提高了系統(tǒng)的靈活性魄健。
- 簡(jiǎn)單工廠將創(chuàng)建產(chǎn)品的職責(zé)放在了單獨(dú)的靜態(tài)工廠中去處理和維護(hù)一定長(zhǎng)度上體現(xiàn)了SRP原則。
簡(jiǎn)單工廠模式的缺點(diǎn)
- 由于工廠類集中了所有產(chǎn)品創(chuàng)建邏輯插勤,一旦不能正常工作沽瘦,整個(gè)系統(tǒng)都要受到影響革骨。
- 使用簡(jiǎn)單工廠模式將會(huì)增加系統(tǒng)中具體產(chǎn)品類的個(gè)數(shù),在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度析恋。
- 系統(tǒng)擴(kuò)展困難良哲,一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時(shí)助隧,有可能造成工廠邏輯過于復(fù)雜筑凫,不利于系統(tǒng)的擴(kuò)展和維護(hù)。
- 由于在增加新的產(chǎn)品的時(shí)候簡(jiǎn)單工廠模式必須要修改靜態(tài)的工廠方法并村,所以它違背了OCP原則巍实。
工廠模式的使用場(chǎng)景
在以下情況下可以使用簡(jiǎn)單工廠模式:
- 工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少:由于創(chuàng)建的對(duì)象較少,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜哩牍。
- 客戶端只知道傳入工廠類的參數(shù)棚潦,對(duì)于如何創(chuàng)建對(duì)象不關(guān)心:客戶端既不需要關(guān)心創(chuàng)建細(xì)節(jié),甚至連類名都不需要記住膝昆,只需要知道類型所對(duì)應(yīng)的參數(shù)丸边。