抽象工廠模式
1.定義
為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個接口提鸟,而且無需指定它們的具體類。
以女媧造人為例仅淑,定義人種(Product產(chǎn)品類)及八卦爐(工廠類)称勋。為人類定義膚色及性別屬性,從設(shè)計角度看涯竟,一個具體的對象可以通過膚色及性別確定赡鲜。生產(chǎn)的工廠類如果只有一個,生產(chǎn)出來的全都是男性或者女性庐船,因此需要拆分為兩個工具類银酬。
人類接口
public interface Human {
// 每個人都有膚色
void getColor();
// 每個人都有性別
void getSex();
}
抽象人種類(根據(jù)膚色劃分)
/*
* 白色人種
*/
public abstract class AbstractWhiteHuman implements Human {
public void getColor() {
System.out.println("白色人種皮膚是白色的")
}
}
/*
* 黑色人種
*/
public abstract class AbstractBlackHuman implements Human {
public void getColor() {
System.out.println("黑色人種皮膚是黑色的")
}
}
/*
* 黃色人種
*/
public abstract class AbstractYellowHuman implements Human {
public void getColor() {
System.out.println("黃色人種皮膚是黃色的")
}
}
具體人類(產(chǎn)品類實現(xiàn)類),每個抽象類都有兩個實現(xiàn)類(男人和女人)筐钟,實現(xiàn)性別的定義揩瞪,以黃色人種為例
public class FemaleYellowHuman extends AbstractYellowHuman {
public void getSex() {
System.out.println("女性黃種人")
}
}
public class MaleYellowHuman extends AbstractYellowHuman {
public void getSex() {
System.out.println("男性黃種人")
}
}
其它的黑色人種與白色人種的代碼與此類似,不再重復(fù)編寫篓冲。到此所有的人種(產(chǎn)品類)已定義完畢李破,接下來需要定義八卦爐(工廠類)生產(chǎn)人類。
八卦爐接口
public interface HumanFactory {
Human createYelloHuman();
Human createBlackHuman();
Human createWhiteHuman();
}
具體八卦爐(工廠實現(xiàn)類)壹将,按性別分為男性八卦爐及女性八卦爐
public class FemaleFactory implements HumanFactory {
public Human createYelloHuman() {
return new FemaleYelloHuman();
}
public Human createBlackHuman() {
return new FemaleBlackHuman();
}
public Human createWhiteHuman() {
return new FemaleWhiteHuman();
}
}
public class MaleFactory implements HumanFactory {
public Human createYelloHuman() {
return new MaleYelloHuman();
}
public Human createBlackHuman() {
return new MaleBlackHuman();
}
public Human createWhiteHuman() {
return new MaleWhiteHuman();
}
}
造人(場景類)
public class Client {
public static void main(String[] args) {
HumanFactory maleHumanFactory = new MaleFactory();
HumanFactory femaleHumanFactory = new FemaleFactory();
Human maleYellowHuman = maleHumanFactory.createYelloHuman();
Human maleBlackHuman = maleHumanFactory.createBlackHuman();
Human maleWhiteHuman = maleHumanFactory.createWhiteHuman();
Human femaleYellowHuman = femaleHumanFactory.createYelloHuman();
Human femaleBlackHuman = femaleHumanFactory.createBlackHuman();
Human femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();
}
}
抽象工廠模式是工廠方法模式的升級嗤攻,在有多個業(yè)務(wù)品種,業(yè)務(wù)分類時诽俯,通過抽象工廠模式產(chǎn)生需要的對象妇菱。如果將八卦爐(工廠類)比喻為車間,那八卦爐的類型(人種性別)可以稱作產(chǎn)品等級暴区,八卦爐的生產(chǎn)工藝(人種膚色)可以稱作產(chǎn)品線或產(chǎn)品族闯团。抽象工廠類的職責(zé)是定義每個工廠要實現(xiàn)的功能即產(chǎn)品線,有M個產(chǎn)品等級就應(yīng)該有M個八卦爐(工廠實現(xiàn)類)颜启,有N個產(chǎn)品線偷俭,在八卦爐(抽象工廠類)中就應(yīng)該有N個生產(chǎn)線(創(chuàng)建方法)。在場景類中缰盏,沒有任何一個方法與產(chǎn)品實現(xiàn)類有關(guān)系涌萤,對于一個產(chǎn)品來說淹遵,只需要知道它的工廠方法就可以直接生產(chǎn)一個產(chǎn)品對象,無需關(guān)心它的實現(xiàn)類负溪。
2.應(yīng)用
2.1 優(yōu)點
- 封裝性透揣。每個產(chǎn)品的實現(xiàn)類不是高層模塊關(guān)心的,它關(guān)心的是接口川抡,是抽象辐真。只要知道工廠類,就可以創(chuàng)造出一個需要的對象崖堤。
2.2 缺點
- 產(chǎn)品族擴展困難侍咱。增加新的產(chǎn)品線,抽象工廠類需要增加新的抽象方法密幔,且所有的工廠實現(xiàn)類都要修改楔脯。
2.3 使用場景
一組沒有任何關(guān)系的對象具有相同的約束,則可以使用抽象工廠模式胯甩。一個視頻編輯器及音頻編輯器昧廷,在unix和windows操作系統(tǒng)中雖然功能和界面都相同,但代碼的實現(xiàn)不同偎箫。也就是所說的具有共同的約束條件(操作系統(tǒng))木柬。因此可使用抽象工廠模式,產(chǎn)生不同操作系統(tǒng)下的視頻及音頻處理器淹办。
2.4 注意事項
在抽象工廠模式的缺點中所說的是產(chǎn)品族擴展困難眉枕,而不是產(chǎn)品等級擴展困難。擴展產(chǎn)品等級只需要增加一個新的工廠實現(xiàn)類即可娇唯,也就是橫向擴展容易齐遵,縱向擴展困難。