设计模式 之 抽象工厂模式
項(xiàng)目源碼:https://gitee.com/Jacob-gitee/DesignMode
個(gè)人博客 :https://jacob.org.cn
女媧的失誤
工廠模式中講了女媧造人的故事。人是造出來了,世界也熱鬧了,可是低頭一看,都是清一色的類型,缺少關(guān)愛、仇恨、喜怒哀樂等情緒,人類的生命太平淡了,女媧一想,猛然一拍腦袋,忘記給人類定義性別了,那怎么辦?抹掉重來,于是人類經(jīng)過一次大洗禮,所有的人種都消滅掉了,世界又是空無一物,寂靜而又寂寞。
由于女媧之前的準(zhǔn)備工作花費(fèi)了非常大的精力,比如準(zhǔn)備黃土、八卦爐等,從頭開始建立所有的事物也是不可能的,那就想在現(xiàn)有的條件下重新造人,盡可能舊物利用嘛。人種 (Product產(chǎn)品類)應(yīng)該怎么改造呢?怎么才能讓人類有愛有恨呢?是神仙當(dāng)然有辦法了,定義互斥的性別,然后在每個(gè)個(gè)體中埋下一顆種子:異性相吸,成熟后就一定會(huì)去找個(gè)異性(這就是我們說的愛情原動(dòng)力)。從設(shè)計(jì)角度來看,一個(gè)具體的對(duì)象通過兩個(gè)坐標(biāo)就可以確 定:膚色和性別。
產(chǎn)品類分析完畢了,生產(chǎn)的工廠類(八卦爐)該怎么改造呢?只有一個(gè)生產(chǎn)設(shè)備,要么生產(chǎn)出來的全都是男性,要么都是女性。那不行呀,這么翻天覆地的改造就是為了產(chǎn)生不同 性別的人類。有辦法了!把目前已經(jīng)有的生產(chǎn)設(shè)備——八卦爐拆開,于是女媧就使用了“八 卦復(fù)制術(shù)”,把原先的八卦爐一個(gè)變兩個(gè),并且略加修改,就成了女性八卦爐(只生產(chǎn)女性 人種)和男性八卦爐(只生產(chǎn)男性人種),于是乎女媧就開始準(zhǔn)備生產(chǎn)了,其類圖如圖9-2所示。
這個(gè)類圖雖然大,但是比較簡(jiǎn)單。Java的典型類圖,一個(gè)接口,多個(gè)抽象類,然后是N個(gè)實(shí)現(xiàn)類,每個(gè)人種都是一個(gè)抽象類,性別是在各個(gè)實(shí)現(xiàn)類中實(shí)現(xiàn)的。特別需要說明的是 HumanFactory接口,在這個(gè)接口中定義了三個(gè)方法,分別用來生產(chǎn)三個(gè)不同膚色的人種,也就是我們?cè)趫D9-1中的Y坐標(biāo),它的兩個(gè)實(shí)現(xiàn)類分別是性別,也就是圖9-1中的X坐標(biāo),通過X 坐標(biāo)(性別)和Y坐標(biāo)(膚色)唯一確定了一個(gè)生產(chǎn)出來的對(duì)象。我們來看看相關(guān)的實(shí)現(xiàn),Human接口。
/*** @program: DesignMode* @description: 人種接口* @author: Jacob* @create: 2020-08-18 10:57**/ public interface Human {//每個(gè)人種都有相應(yīng)的顏色public void getColor();//人類會(huì)說話public void talk();//每個(gè)人都有性別public void getSex();}人種有三個(gè)抽象類,負(fù)責(zé)人種的抽象屬性定義:膚色和語(yǔ)言。白色人種、黑色人種、黃 色人種分別如代碼。
/*** @program: DesignMode* @description: 黑色人種* @author: Jacob* @create: 2020-08-18 11:14**/ public abstract class AbstractBlackHuman implements Human{//黑色人種的皮膚顏色是黑色的@Overridepublic void getColor() {System.out.println("黑色人種的皮膚顏色是黑色的!");}//黑色人種講話@Overridepublic void talk() {System.out.println("黑色人種會(huì)說話,一般人聽不懂。");}} /*** @program: DesignMode* @description: 白色人種* @author: Jacob* @create: 2020-08-18 11:13**/ public abstract class AbstractWhiteHuman implements Human {//白色人種的皮膚顏色是白色的@Overridepublic void getColor() {System.out.println("白色人種的皮膚顏色是白色的!");}//白色人種講話@Overridepublic void talk() {System.out.println("白色人種會(huì)說話,一般說的都是單字節(jié)。");}} /*** @program: DesignMode* @description: 黃色人種* @author: Jacob* @create: 2020-08-18 11:16**/ public abstract class AbstractYellowHuman implements Human {//黃色人種的皮膚顏色是黃色的@Overridepublic void getColor() {System.out.println("黃色人種的皮膚顏色是黃色的!");}//黃色人種講話@Overridepublic void talk() {System.out.println("黃色人種會(huì)說話,一般說的都是雙字節(jié)。");}}每個(gè)抽象類都有兩個(gè)實(shí)現(xiàn)類,分別實(shí)現(xiàn)公共的最細(xì)節(jié)、最具體的事物:膚色和語(yǔ)言。具 體的實(shí)現(xiàn)類實(shí)現(xiàn)膚色、性別定義。
/*** @program: DesignMode* @description: 黑色女性人種* @author: Jacob* @create: 2020-08-18 11:21**/ public class FemaleBlackHuman extends AbstractBlackHuman {@Overridepublic void getSex() {System.out.println("黑色女性人種");} } /*** @program: DesignMode* @description: 黑色男性人種* @author: Jacob* @create: 2020-08-18 11:22**/ public class MaleBlackHuman extends AbstractBlackHuman{@Overridepublic void getSex() {System.out.println("黑色男性人種");} } /*** @program: DesignMode* @description: 白色女性人種* @author: Jacob* @create: 2020-08-18 11:20**/ public class FemaleWhiteHuman extends AbstractWhiteHuman{@Overridepublic void getSex() {System.out.println("白色女性人種");} } /*** @program: DesignMode* @description: 白色男性人種* @author: Jacob* @create: 2020-08-18 11:20**/ public class MaleWhiteHuman extends AbstractWhiteHuman{@Overridepublic void getSex() {System.out.println("白色男性人種");} } /*** @program: DesignMode* @description: 黃色女性人種* @author: Jacob* @create: 2020-08-18 11:17**/ public class FemaleYellowHuman extends AbstractYellowHuman {@Overridepublic void getSex() {System.out.println("黃色女性人種");} } /*** @program: DesignMode* @description: 黃色男性人種* @author: Jacob* @create: 2020-08-18 11:18**/ public class MaleYellowHuman extends AbstractYellowHuman {@Overridepublic void getSex() {System.out.println("黃色男性人種");} }到此為止,我們已經(jīng)把真實(shí)世界的人種都定義出來了,剩下的工作就是怎么制造人類。
/*** @program: DesignMode* @description: 八卦爐定義* @author: Jacob* @create: 2020-08-18 17:47**/ public interface HumanFactory {//制造一個(gè)黃色人種public Human createYellowHuman();//制造一個(gè)白色人種public Human createWhiteHuman();//制造一個(gè)黑色人種public Human createBlackHuman();}在接口中,我們看到八卦爐是可以生產(chǎn)出不同膚色人種的(當(dāng)然了,女媧的失誤嘛), 那它有多少個(gè)八卦爐呢?兩個(gè),分別生產(chǎn)女性和男性,女性和男性八卦爐。
/*** @program: DesignMode* @description: 生產(chǎn)女性的八卦爐* @author: Jacob* @create: 2020-08-18 17:48**/ public class FemaleFactory implements HumanFactory {//生產(chǎn)出黃人女性@Overridepublic Human createYellowHuman() {return new FemaleYellowHuman();}//生產(chǎn)出白人女性@Overridepublic Human createWhiteHuman() {return new FemaleWhiteHuman();}//生產(chǎn)出黑人女性@Overridepublic Human createBlackHuman() {return new FemaleBlackHuman();} } /*** @program: DesignMode* @description: 生產(chǎn)男性的八卦爐* @author: Jacob* @create: 2020-08-18 17:49**/ public class MaleFactory implements HumanFactory {//生產(chǎn)出黑人男性@Overridepublic Human createBlackHuman() {return new MaleBlackHuman();}//生產(chǎn)出白人男性@Overridepublic Human createWhiteHuman() {return new MaleWhiteHuman();}//生產(chǎn)出黃人男性@Overridepublic Human createYellowHuman() {return new MaleYellowHuman();}}人種有了,八卦爐也有了,我們就來重現(xiàn)一下當(dāng)年女媧造人的光景。
/*** @program: DesignMode* @description: 女媧重造人類* @author: Jacob* @create: 2020-08-18 17:51**/ public class NvWa {public static void main(String[] args) {//第一條生產(chǎn)線,男性生產(chǎn)線HumanFactory maleHumanFactory = new MaleFactory();//第二條生產(chǎn)線,女性生產(chǎn)線HumanFactory femaleHumanFactory = new FemaleFactory();//生產(chǎn)線建立完畢,開始生產(chǎn)人了:Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();Human femaleBlackHuman = femaleHumanFactory.createBlackHuman();Human femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();System.out.println("---生產(chǎn)一個(gè)黃色女性---");femaleYellowHuman.getColor();femaleYellowHuman.talk();femaleYellowHuman.getSex();System.out.println("---生產(chǎn)一個(gè)黑色女性---");femaleBlackHuman.getColor();femaleBlackHuman.talk();femaleBlackHuman.getSex();System.out.println("---生產(chǎn)一個(gè)白色女性---");femaleWhiteHuman.getColor();femaleWhiteHuman.talk();femaleWhiteHuman.getSex();Human maleYellowHuman = maleHumanFactory.createYellowHuman();Human maleBlackHuman = maleHumanFactory.createBlackHuman();Human maleWhiteHuman = maleHumanFactory.createWhiteHuman();System.out.println("\n---生產(chǎn)一個(gè)黃色男性---");femaleWhiteHuman.getColor();maleYellowHuman.talk();maleYellowHuman.getSex();System.out.println("\n---生產(chǎn)一個(gè)黃色男性---");maleBlackHuman.getColor();maleBlackHuman.talk();maleBlackHuman.getSex();System.out.println("\n---生產(chǎn)一個(gè)白色男性---");maleWhiteHuman.getColor();maleWhiteHuman.talk();maleWhiteHuman.getSex();}} 運(yùn)行結(jié)果如下所示: ---生產(chǎn)一個(gè)黃色女性--- 黃色人種的皮膚顏色是黃色的! 黃色人種會(huì)說話,一般說的都是雙字節(jié)。 黃色女性人種 ---生產(chǎn)一個(gè)黑色女性--- 黑色人種的皮膚顏色是黑色的! 黑色人種會(huì)說話,一般人聽不懂。 黑色女性人種 ---生產(chǎn)一個(gè)白色女性--- 白色人種的皮膚顏色是白色的! 白色人種會(huì)說話,一般說的都是單字節(jié)。 白色女性人種---生產(chǎn)一個(gè)黃色男性--- 白色人種的皮膚顏色是白色的! 黃色人種會(huì)說話,一般說的都是雙字節(jié)。 黃色男性人種---生產(chǎn)一個(gè)黃色男性--- 黑色人種的皮膚顏色是黑色的! 黑色人種會(huì)說話,一般人聽不懂。 黑色男性人種---生產(chǎn)一個(gè)白色男性--- 白色人種的皮膚顏色是白色的! 白色人種會(huì)說話,一般說的都是單字節(jié)。 白色男性人種各種膚色的男性、女性都制造出來了,兩性之間產(chǎn)生了相互吸引力,于是情感產(chǎn)生,這 個(gè)世界就多了一種小說的題材“愛情”?;仡^來想想我們的設(shè)計(jì),不知道大家有沒有去過工廠,每個(gè)工廠分很多車間,每個(gè)車間又分多條生產(chǎn)線,分別生產(chǎn)不同的產(chǎn)品,我們可以把八卦爐比喻為車間,把八卦爐生產(chǎn)的工藝(生產(chǎn)白人、黑人還是黃人)稱為生產(chǎn)線,如此來看就是一個(gè)女性生產(chǎn)車間,專門生產(chǎn)各種膚色的女性,一個(gè)是男性生產(chǎn)車間,專門生產(chǎn)各種膚色男性,生產(chǎn)完畢就可以在系統(tǒng)外組裝,什么是組裝?嘿嘿,自己思考!在這樣的設(shè)計(jì)下,各個(gè)車間和各條生產(chǎn)線的職責(zé)非常明確,在車間內(nèi)各個(gè)生產(chǎn)出來的產(chǎn)品可以有耦合關(guān)系,你 要知道世界上黑、黃、白人種的比例是:1∶4∶6,那這就需要女媧娘娘在燒制的時(shí)候就要做好比例分配,在一個(gè)車間內(nèi)協(xié)調(diào)好。這就是抽象工廠模式。
抽象工廠模式的定義
抽象工廠模式(Abstract Factory Pattern)是一種比較常用的模式,其定義如下:
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無須指定它們的具體類。)
抽象工廠模式是工廠方法模式的升級(jí)版本,在有多個(gè)業(yè)務(wù)品種、業(yè)務(wù)分類時(shí),通過抽象工廠模式產(chǎn)生需要的對(duì)象是一種非常好的解決方式。我們來看看抽象工廠的通用源代碼,首先有兩個(gè)互相影響的產(chǎn)品線(也叫做產(chǎn)品族),例如制造汽車的左側(cè)門和右側(cè)門,這兩個(gè)應(yīng) 該是數(shù)量相等的——兩個(gè)對(duì)象之間的約束,每個(gè)型號(hào)的車門都是不一樣的,這是產(chǎn)品等級(jí)結(jié) 構(gòu)約束的,我們先看看兩個(gè)產(chǎn)品族的類圖。
注意類圖上的圈圈、框框相對(duì)應(yīng),兩個(gè)抽象的產(chǎn)品類可以有關(guān)系,例如共同繼承或?qū)崿F(xiàn) 一個(gè)抽象類或接口。
/*** @program: DesignMode* @description: 抽象產(chǎn)品A類* @author: Jacob* @create: 2020-08-18 17:57**/ public abstract class AbstractProductA {//每個(gè)產(chǎn)品共有的方法public void shareMethod() {System.out.println("每個(gè)產(chǎn)品A共有的方法");}//每個(gè)產(chǎn)品相同方法,不同實(shí)現(xiàn)public abstract void doSomething(); } /*** @program: DesignMode* @description: 產(chǎn)品A1的實(shí)現(xiàn)類* @author: Jacob* @create: 2020-08-18 17:58**/ public class ProductA1 extends AbstractProductA {@Overridepublic void doSomething() {System.out.println("產(chǎn)品A1的實(shí)現(xiàn)方法");} } /*** @program: DesignMode* @description: 產(chǎn)品A1的實(shí)現(xiàn)類* @author: Jacob* @create: 2020-08-18 17:58**/ public class ProductA2 extends AbstractProductA {@Overridepublic void doSomething() {System.out.println("產(chǎn)品A2的實(shí)現(xiàn)方法");} } /*** @program: DesignMode* @description: 抽象產(chǎn)品B類* @author: Jacob* @create: 2020-08-18 17:57**/ public abstract class AbstractProductB {//每個(gè)產(chǎn)品共有的方法public void shareMethod() {System.out.println("每個(gè)產(chǎn)品B共有的方法");}//每個(gè)產(chǎn)品相同方法,不同實(shí)現(xiàn)public abstract void doSomething(); } /*** @program: DesignMode* @description: 產(chǎn)品B1實(shí)現(xiàn)類* @author: Jacob* @create: 2020-08-18 17:58**/ public class ProductB1 extends AbstractProductB {@Overridepublic void doSomething() {System.out.println("產(chǎn)品B1的實(shí)現(xiàn)方法");} } /*** @program: DesignMode* @description: 產(chǎn)品B2實(shí)現(xiàn)類* @author: Jacob* @create: 2020-08-18 17:58**/ public class ProductB2 extends AbstractProductB {@Overridepublic void doSomething() {System.out.println("產(chǎn)品B2的實(shí)現(xiàn)方法");} }抽象工廠類AbstractCreator的職責(zé)是定義每個(gè)工廠要實(shí)現(xiàn)的 功能,在通用代碼中,抽象工廠類定義了兩個(gè)產(chǎn)品族的產(chǎn)品創(chuàng)建。
/*** @program: DesignMode* @description: 抽象工廠類* @author: Jacob* @create: 2020-08-18 18:02**/ public abstract class AbstractCreator {//創(chuàng)建A產(chǎn)品家族public abstract AbstractProductA createProductA();//創(chuàng)建B產(chǎn)品家族public abstract AbstractProductB createProductB();}注意:有N個(gè)產(chǎn)品族,在抽象工廠類中就應(yīng)該有N個(gè)創(chuàng)建方法。
如何創(chuàng)建一個(gè)產(chǎn)品,則是由具體的實(shí)現(xiàn)類來完成的。
/*** @program: DesignMode* @description: 產(chǎn)品等級(jí)1的實(shí)現(xiàn)類* @author: Jacob* @create: 2020-08-18 18:03**/ public class Creator1 extends AbstractCreator {//只生產(chǎn)產(chǎn)品等級(jí)為1的A產(chǎn)品@Overridepublic AbstractProductA createProductA() {return new ProductA1();}//只生產(chǎn)產(chǎn)品等級(jí)為1的B產(chǎn)品@Overridepublic AbstractProductB createProductB() {return new ProductB1();} } /*** @program: DesignMode* @description: 產(chǎn)品等級(jí)1的實(shí)現(xiàn)類* @author: Jacob* @create: 2020-08-18 18:03**/ public class Creator2 extends AbstractCreator {//只生產(chǎn)產(chǎn)品等級(jí)為1的A產(chǎn)品@Overridepublic AbstractProductA createProductA() {return new ProductA2();}//只生產(chǎn)產(chǎn)品等級(jí)為1的B產(chǎn)品@Overridepublic AbstractProductB createProductB() {return new ProductB2();} }注意:有M個(gè)產(chǎn)品等級(jí)就應(yīng)該有M個(gè)實(shí)現(xiàn)工廠類,在每個(gè)實(shí)現(xiàn)工廠中,實(shí)現(xiàn)不同產(chǎn)品族的生產(chǎn)任務(wù)。
在具體的業(yè)務(wù)中如何產(chǎn)生一個(gè)與實(shí)現(xiàn)無關(guān)的對(duì)象呢?
/*** @program: DesignMode* @description: 場(chǎng)景類* @author: Jacob* @create: 2020-08-18 18:08**/ public class Client {public static void main(String[] args) {//定義出兩個(gè)工廠AbstractCreator creator1 = new Creator1();AbstractCreator creator2 = new Creator2();//產(chǎn)生A1對(duì)象AbstractProductA a1 = creator1.createProductA();a1.doSomething();a1.shareMethod();//產(chǎn)生A2對(duì)象AbstractProductA a2 = creator2.createProductA();a2.doSomething();a2.shareMethod();//產(chǎn)生B1對(duì)象AbstractProductB b1 = creator1.createProductB();b1.doSomething();b1.shareMethod();//產(chǎn)生B2對(duì)象AbstractProductB b2 = creator2.createProductB();b2.doSomething();b2.shareMethod();} }在場(chǎng)景類中,沒有任何一個(gè)方法與實(shí)現(xiàn)類有關(guān)系,對(duì)于一個(gè)產(chǎn)品來說,我們只要知道它的工廠方法就可以直接產(chǎn)生一個(gè)產(chǎn)品對(duì)象,無須關(guān)心它的實(shí)現(xiàn)類。
運(yùn)行結(jié)果如下所示: 產(chǎn)品A1的實(shí)現(xiàn)方法 每個(gè)產(chǎn)品A共有的方法 產(chǎn)品A2的實(shí)現(xiàn)方法 每個(gè)產(chǎn)品A共有的方法 產(chǎn)品B1的實(shí)現(xiàn)方法 每個(gè)產(chǎn)品B共有的方法 產(chǎn)品B2的實(shí)現(xiàn)方法 每個(gè)產(chǎn)品B共有的方法抽象工廠模式的應(yīng)用
抽象工廠模式的優(yōu)點(diǎn)
-
封裝性,每個(gè)產(chǎn)品的實(shí)現(xiàn)類不是高層模塊要關(guān)心的,它要關(guān)心的是什么?是接口,是抽象,它不關(guān)心對(duì)象是如何創(chuàng)建出來,這由誰(shuí)負(fù)責(zé)呢?工廠類,只要知道工廠類是誰(shuí),我就能創(chuàng)建出一個(gè)需要的對(duì)象,省時(shí)省力,優(yōu)秀設(shè)計(jì)就應(yīng)該如此。
-
產(chǎn)品族內(nèi)的約束為非公開狀態(tài)。例如生產(chǎn)男女比例的問題上,猜想女媧娘娘肯定有自己的打算,不能讓女盛男衰,否則女性的優(yōu)點(diǎn)不就體現(xiàn)不出來了嗎?那在抽象工廠模式,就 應(yīng)該有這樣的一個(gè)約束:每生產(chǎn)1個(gè)女性,就同時(shí)生產(chǎn)出1.2個(gè)男性,這樣的生產(chǎn)過程對(duì)調(diào)用工廠類的高層模塊來說是透明的,它不需要知道這個(gè)約束,我就是要一個(gè)黃色女性產(chǎn)品就可以了,具體的產(chǎn)品族內(nèi)的約束是在工廠內(nèi)實(shí)現(xiàn)的。
抽象工廠模式的缺點(diǎn)
抽象工廠模式的最大缺點(diǎn)就是產(chǎn)品族擴(kuò)展非常困難,為什么這么說呢?我們以通用代碼 為例,如果要增加一個(gè)產(chǎn)品C,也就是說產(chǎn)品家族由原來的2個(gè)增加到3個(gè),看看我們的程序 有多大改動(dòng)吧!抽象類AbstractCreator要增加一個(gè)方法createProductC(),然后兩個(gè)實(shí)現(xiàn)類都要修改,想想看,這嚴(yán)重違反了開閉原則,而且我們一直說明抽象類和接口是一個(gè)契約。改變 契約,所有與契約有關(guān)系的代碼都要修,那么這段代碼叫什么?叫“有毒代碼”,——只要與這段代碼有關(guān)系,就可能產(chǎn)生侵害的危險(xiǎn)!
抽象工廠模式的使用場(chǎng)景
抽象工廠模式的使用場(chǎng)景定義非常簡(jiǎn)單:一個(gè)對(duì)象族(或是一組沒有任何關(guān)系的對(duì)象)都有相同的約束,則可以使用抽象工廠模式。什么意思呢?例如一個(gè)文本編輯器和一個(gè)圖片處理器,都是軟件實(shí)體,但是*nix下的文本編輯器和Windows下的文本編輯器雖然功能和界
面都相同,但是代碼實(shí)現(xiàn)是不同的,圖片處理器也有類似情況。也就是具有了共同的約束條件:操作系統(tǒng)類型。于是我們可以使用抽象工廠模式,產(chǎn)生不同操作系統(tǒng)下的編輯器和圖片處理器。
抽象工廠模式的注意事項(xiàng)
在抽象工廠模式的缺點(diǎn)中,我們提到抽象工廠模式的產(chǎn)品族擴(kuò)展比較困難,但是一定要清楚,是產(chǎn)品族擴(kuò)展困難,而不是產(chǎn)品等級(jí)。在該模式下,產(chǎn)品等級(jí)是非常容易擴(kuò)展的,增加一個(gè)產(chǎn)品等級(jí),只要增加一個(gè)工廠類負(fù)責(zé)新增加出來的產(chǎn)品生產(chǎn)任務(wù)即可。也就是說橫向
擴(kuò)展容易,縱向擴(kuò)展困難。以人類為例子,產(chǎn)品等級(jí)中只有男、女兩個(gè)性別,現(xiàn)實(shí)世界還有一種性別:雙性人,既是男人也是女人(俗語(yǔ)就是陰陽(yáng)人),那我們要擴(kuò)展這個(gè)產(chǎn)品等級(jí)也是非常容易的,增加三個(gè)產(chǎn)品類,分別對(duì)應(yīng)不同的膚色,然后再創(chuàng)建一個(gè)工廠類,專門負(fù)責(zé)不同膚色人的雙性人的創(chuàng)建任務(wù),完全通過擴(kuò)展來實(shí)現(xiàn)需求的變更,從這一點(diǎn)上看,抽象工廠模式是符合開閉原則的。
最佳實(shí)踐
一個(gè)模式在什么情況下才能夠使用,是很多讀者比較困惑的地方。抽象工廠模式是一個(gè)簡(jiǎn)單的模式,使用的場(chǎng)景非常多,大家在軟件產(chǎn)品開發(fā)過程中,涉及不同操作系統(tǒng)的時(shí)候, 都可以考慮使用抽象工廠模式,例如一個(gè)應(yīng)用,需要在三個(gè)不同平臺(tái)(Windows、Linux、 Android(Google發(fā)布的智能終端操作系統(tǒng)))上運(yùn)行,你會(huì)怎么設(shè)計(jì)?分別設(shè)計(jì)三套不同的應(yīng)用?非也,通過抽象工廠模式屏蔽掉操作系統(tǒng)對(duì)應(yīng)用的影響。三個(gè)不同操作系統(tǒng)上的軟 件功能、應(yīng)用邏輯、UI都應(yīng)該是非常類似的,唯一不同的是調(diào)用不同的工廠方法,由不同的產(chǎn)品類去處理與操作系統(tǒng)交互的信息。
學(xué)習(xí)于:《設(shè)計(jì)模式之禪》 — 秦小波
總結(jié)
以上是生活随笔為你收集整理的设计模式 之 抽象工厂模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【高并发高性能高可用之海量数据MySQL
- 下一篇: 设计模式 之 模板模式