簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式舆绎,又叫做靜態(tài)工廠方法(Static Factory Method)模式隆敢,但不屬于23種GOF設(shè)計(jì)模式之一考阱。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例勾拉。簡(jiǎn)單工廠模式是工廠模式家族中最簡(jiǎn)單實(shí)用的模式国裳,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)形入。
外文名 Factory Method Pattern
屬 于 創(chuàng)建型模式
簡(jiǎn)單工廠模式的實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù),動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類(這些產(chǎn)品類繼承自一個(gè)父類或接口)的實(shí)例缝左。
該模式中包含的角色及其職責(zé)
工廠(Creator)角色
簡(jiǎn)單工廠模式的核心亿遂,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類的創(chuàng)建產(chǎn)品類的方法可以被外界直接調(diào)用渺杉,創(chuàng)建所需的產(chǎn)品對(duì)象蛇数。
抽象產(chǎn)品(Product)角色
簡(jiǎn)單工廠模式所創(chuàng)建的所有對(duì)象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口是越。
具體產(chǎn)品(Concrete Product)角色
是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)耳舅,所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例。
優(yōu)點(diǎn)
工廠類是整個(gè)模式的關(guān)鍵.包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象.通過(guò)使用工廠類,外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)象的尷尬局面擺脫出來(lái),僅僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了倚评。而不必管這些對(duì)象究竟如何創(chuàng)建及如何組織的.明確了各自的職責(zé)和權(quán)利挽放,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化绍赛。
缺點(diǎn)
由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則辑畦,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類中吗蚌;它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類纯出,則就需要改變工廠類了蚯妇。
當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時(shí)候,可能會(huì)出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實(shí)例的需求.這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類型的判斷交錯(cuò)在一起暂筝,很難避免模塊功能的蔓延箩言,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利;
這些缺點(diǎn)在工廠方法模式中得到了一定的克服焕襟。
使用場(chǎng)景
工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少陨收;
客戶只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象(邏輯)不關(guān)心鸵赖;
由于簡(jiǎn)單工廠很容易違反高內(nèi)聚責(zé)任分配原則务漩,因此一般只在很簡(jiǎn)單的情況下應(yīng)用。
代碼實(shí)現(xiàn):
我們需要一個(gè)產(chǎn)品和一個(gè)工廠它褪。那么我們先來(lái)創(chuàng)建一個(gè)產(chǎn)品饵骨。
public interface Product {
void name();
}
接下來(lái)我們?cè)趧?chuàng)建幾個(gè)實(shí)現(xiàn)類,這里我們創(chuàng)建一個(gè)產(chǎn)品A和產(chǎn)品B茫打。
產(chǎn)品A
public class ProductA implements Product{
@Override
public void name() {
System.out.println("產(chǎn)品A");
}
}
產(chǎn)品B
public class ProductB implements Product{
@Override
public void name() {
System.out.println("產(chǎn)品B");
}
}
接下來(lái)我們需要一個(gè)工廠類:Factory來(lái)創(chuàng)建產(chǎn)品居触。
我們提供一個(gè)創(chuàng)建產(chǎn)品方法:createProduct
接著我們可以判斷產(chǎn)品類型,并根據(jù)不同類型來(lái)創(chuàng)建不同產(chǎn)品老赤。
public class Factory {
public static Product createProduct(char type) {
switch (type) {
case 'a':
return new ProductA();
case 'b':
return new ProductB();
default:
return null;
}
}
}
以上是簡(jiǎn)單的簡(jiǎn)單工廠的實(shí)現(xiàn)轮洋。在介紹中也說(shuō)過(guò),但這種實(shí)現(xiàn)違背了設(shè)計(jì)模式的開閉原則抬旺。原因是在我們?cè)黾赢a(chǎn)品類的時(shí)候就不得不改動(dòng)工廠類了弊予。
我們可以用反射來(lái)彌補(bǔ)這點(diǎn)的不足。
我們修改工廠類:
public class Factory {
public static Product createProduct(Class<? extends Product> clz)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
return (Product) Class.forName(clz.getName()).newInstance();
}
}