這一篇博文來介紹工廠模式中的第三種抽象工廠模式。
介紹
抽象工廠模式(Abstract Factory Pattern):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口卸伞,而無須指定它們具體的類杏头。抽象工廠模式又稱為Kit模式欲间,屬于對(duì)象創(chuàng)建型模式。
抽象工廠模式不同于前面兩個(gè)模式匀泊,這篇也用支付的案例來講解优训。
現(xiàn)實(shí)中發(fā)生的支付情況可能是這樣:
支付都有個(gè)商戶號(hào),然而現(xiàn)在有兩個(gè)商戶號(hào)各聘,需要在不同時(shí)間段切換使用揣非,例如上午使用A支付商戶號(hào)、下午使用B支付商戶號(hào)躲因。
優(yōu)點(diǎn)
抽象工廠模式隔離了具體類的生成早敬,使得客戶并不需要知道什么被創(chuàng)建。由于這種隔離大脉,更換一個(gè)具體工廠就變得相對(duì)容易搞监。所有的具體工廠都實(shí)現(xiàn)了抽象工廠中定義的那些公共接口,因此只需改變具體工廠的實(shí)例镰矿,就可以在某種程度上改變整個(gè)軟件系統(tǒng)的行為琐驴。另外,應(yīng)用抽象工廠模式可以實(shí)現(xiàn)高內(nèi)聚低耦合的設(shè)計(jì)目的秤标,因此抽象工廠模式得到了廣泛的應(yīng)用绝淡。
當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能夠保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象抛杨。這對(duì)一些需要根據(jù)當(dāng)前環(huán)境來決定其行為的軟件系統(tǒng)來說够委,是一種非常實(shí)用的設(shè)計(jì)模式。
增加新的具體工廠和產(chǎn)品族很方便怖现,無須修改已有系統(tǒng),符合“開閉原則”。
缺點(diǎn)
在添加新的產(chǎn)品對(duì)象時(shí)屈嗤,難以擴(kuò)展抽象工廠來生產(chǎn)新種類的產(chǎn)品潘拨,這是因?yàn)樵诔橄蠊S角色中規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,要支持新種類的產(chǎn)品就意味著要對(duì)該接口進(jìn)行擴(kuò)展饶号,而這將涉及到對(duì)抽象工廠角色及其所有子類的修改铁追,顯然會(huì)帶來較大的不便。
開閉原則的傾斜性(增加新的工廠和產(chǎn)品族容易茫船,增加新的產(chǎn)品等級(jí)結(jié)構(gòu)麻煩)琅束。
案例
早晨支付抽象類
public abstract class MorningPay {
public abstract void morningOrderPay();
}
早晨支付寶支付類
public class MorningAliPay extends MorningPay {
@Override
public void morningOrderPay() {
System.out.println("支付寶支付");
}
}
早晨微信支付類
public class MorningWechatPay extends MorningPay {
@Override
public void morningOrderPay() {
System.out.println("微信支付");
}
}
下午的支付類同上,就不貼出來了
抽象工廠類
public abstract class PayFactory {
public abstract MorningPay getMorningPay();
public abstract AfternoonPay getAfternoonPay();
}
支付寶抽象工廠類
public class AliPayFactory extends PayFactory {
@Override
public MorningPay getMorningPay() {
return new MorningAliPay();
}
@Override
public AfternoonPay getAfternoonPay() {
return new AfternoonAliPay();
}
}
微信支付工廠類
public class WechatPayFactory extends PayFactory {
@Override
public MorningPay getMorningPay() {
return new MorningWechatPay();
}
@Override
public AfternoonPay getAfternoonPay() {
return new AfternoonWechatPay();
}
}
具體代碼見Github地址
總結(jié)
抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口算谈,而無須指定它們具體的類涩禀。抽象工廠模式又稱為Kit模式,屬于對(duì)象創(chuàng)建型模式然眼。
抽象工廠模式包含四個(gè)角色:抽象工廠用于聲明生成抽象產(chǎn)品的方法艾船;具體工廠實(shí)現(xiàn)了抽象工廠聲明的生成抽象產(chǎn)品的方法,生成一組具體產(chǎn)品高每,這些產(chǎn)品構(gòu)成了一個(gè)產(chǎn)品族屿岂,每一個(gè)產(chǎn)品都位于某個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中;抽象產(chǎn)品為每種產(chǎn)品聲明接口鲸匿,在抽象產(chǎn)品中定義了產(chǎn)品的抽象業(yè)務(wù)方法爷怀;具體產(chǎn)品定義具體工廠生產(chǎn)的具體產(chǎn)品對(duì)象,實(shí)現(xiàn)抽象產(chǎn)品接口中定義的業(yè)務(wù)方法带欢。
抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)运授。抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)洪囤,而抽象工廠模式則需要面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)徒坡。
抽象工廠模式的主要優(yōu)點(diǎn)是隔離了具體類的生成,使得客戶并不需要知道什么被創(chuàng)建瘤缩,而且每次可以通過具體工廠類創(chuàng)建一個(gè)產(chǎn)品族中的多個(gè)對(duì)象喇完,增加或者替換產(chǎn)品族比較方便,增加新的具體工廠和產(chǎn)品族很方便剥啤;主要缺點(diǎn)在于增加新的產(chǎn)品等級(jí)結(jié)構(gòu)很復(fù)雜锦溪,需要修改抽象工廠和所有的具體工廠類,對(duì)“開閉原則”的支持呈現(xiàn)傾斜性府怯。
抽象工廠模式適用情況包括:一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建刻诊、組合和表達(dá)的細(xì)節(jié);系統(tǒng)中有多于一個(gè)的產(chǎn)品族牺丙,而每次只使用其中某一產(chǎn)品族则涯;屬于同一個(gè)產(chǎn)品族的產(chǎn)品將在一起使用复局;系統(tǒng)提供一個(gè)產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn)粟判,從而使客戶端不依賴于具體實(shí)現(xiàn)亿昏。
其實(shí)抽象工廠的方法經(jīng)常以工廠方法的方式實(shí)現(xiàn)。而且在抽象工廠中還可以使用簡(jiǎn)單工廠方法档礁,著支付案例中就可以用簡(jiǎn)單工廠方法獲取具體實(shí)例化哪個(gè)支付類角钩,這邊就不再進(jìn)行說明。