這一篇博文來介紹工廠模式中的第二種工廠方法模式格侯。
介紹
工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式脱吱,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口蝙斜,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成澎胡,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類孕荠。
優(yōu)點(diǎn)
在工廠方法模式中,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品攻谁,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié)稚伍,用戶只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié)戚宦,甚至無須知道具體產(chǎn)品類的類名个曙。
基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)建何種產(chǎn)品對象受楼,而如何創(chuàng)建這個(gè)對象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部垦搬。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類艳汽。
使用工廠方法模式的另一個(gè)優(yōu)點(diǎn)是在系統(tǒng)中加入新產(chǎn)品時(shí)猴贰,無須修改抽象工廠和抽象產(chǎn)品提供的接口,無須修改客戶端河狐,也無須修改其他的具體工廠和具體產(chǎn)品米绕,而只要添加一個(gè)具體工廠和具體產(chǎn)品就可以了瑟捣。這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好栅干,完全符合“開閉原則”蝶柿。
缺點(diǎn)
在添加新產(chǎn)品時(shí),需要編寫新的具體產(chǎn)品類非驮,而且還要提供與之對應(yīng)的具體工廠類交汤,系統(tǒng)中類的個(gè)數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜度劫笙,有更多的類需要編譯和運(yùn)行芙扎,會(huì)給系統(tǒng)帶來一些額外的開銷。
由于考慮到系統(tǒng)的可擴(kuò)展性填大,需要引入抽象層戒洼,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度允华,且在實(shí)現(xiàn)時(shí)可能需要用到DOM圈浇、反射等技術(shù),增加了系統(tǒng)的實(shí)現(xiàn)難度靴寂。
案例
這一篇博文也采用上一篇支付的案例進(jìn)行說明磷蜀。
支付抽象類
public abstract class Pay {
public void init(){
System.out.println("支付方式初始化");
}
public abstract void orderPay();
}
支付寶支付類
public class AliPay extends Pay {
@Override
public void orderPay() {
System.out.println("支付寶支付");
}
}
微信支付類
public class WechatPay extends Pay {
@Override
public void orderPay() {
System.out.println("微信支付");
}
}
銀聯(lián)支付類
public class UnionPay extends Pay {
@Override
public void orderPay() {
System.out.println("銀聯(lián)支付");
}
}
抽象工廠類
public abstract class PayFactory {
public abstract Pay createFactory();
}
支付寶工廠類
public class AliPayFactory extends PayFactory {
@Override
public Pay createFactory() {
return new AliPay();
}
}
微信工廠類
public class WechatPayFactory extends PayFactory {
@Override
public Pay createFactory() {
return new WechatPay();
}
}
銀聯(lián)工廠類
public class UnionPayFactory extends PayFactory {
@Override
public Pay createFactory() {
return new UnionPay();
}
}
具體代碼見Github地址
總結(jié)
工廠方法模式可以說是簡單工廠模式的進(jìn)一步優(yōu)化,解決了對修改開放的問題百炬,又保持了簡單工廠模式的優(yōu)點(diǎn)褐隆。唯一的缺點(diǎn)就是增加新產(chǎn)品的同時(shí)需要增加新的工廠,導(dǎo)致系統(tǒng)類的個(gè)數(shù)成對增加剖踊,在一定程度上增加了系統(tǒng)的復(fù)雜性庶弃。
類似的案例有日志記錄器(選擇記錄文件、數(shù)據(jù)庫德澈。歇攻。。)梆造、數(shù)據(jù)庫連接(連接不同的數(shù)據(jù)庫)