三言兩語說透設計模式的藝術-抽象工廠模式
1、寫在前面
工廠方法模式通過定義一個工廠接口,將對象實例化的過程抽象出來。但是它存在一個問題,就是一個具體工廠只能創(chuàng)建一類產(chǎn)品,增加新的產(chǎn)品類型時,需要新增具體工廠,違反開閉原則。
那么,如果我們能有一個汽車工廠,既可以生產(chǎn)普通汽車,也可以生產(chǎn)豪華汽車,那豈不美哉?這就是抽象工廠模式要解決的問題。
2、抽象工廠模式的介紹
抽象工廠模式(Abstract Factory Pattern)是一種軟件設計模式,它屬于創(chuàng)建型模式,其主要目的是創(chuàng)建一組相關或互相依賴的對象。抽象工廠模式可以對類的實例化過程進行抽象和封裝,并且可以將不同類的實例化分配到不同的具體工廠中,從而使得同一個抽象工廠可以創(chuàng)建出不同的產(chǎn)品對象。
抽象工廠模式通過抽象層進行解耦,可以獨立于產(chǎn)品類的具體實現(xiàn)變化,使得用戶可以更加容易地切換不同的產(chǎn)品,而不需要修改已有系統(tǒng)。當需要創(chuàng)建一組相關的對象時,抽象工廠模式尤為合適。它可以確保同一工廠創(chuàng)建的對象是相互兼容、協(xié)調的。
3、抽象工廠與其他相關模式
抽象工廠模式與工廠方法模式非常相似,都用于封裝對象的創(chuàng)建。區(qū)別在于,工廠方法模式中每一個工廠只創(chuàng)建一種產(chǎn)品,而抽象工廠模式可以創(chuàng)建多個相關的產(chǎn)品。抽象工廠也稱為工廠的工廠,是工廠方法模式的升級版本。
與建造者模式的區(qū)別在于,建造者模式更注重零件的裝配順序,而抽象工廠模式更注重組合,不太關心創(chuàng)建步驟。和原型模式比較,原型模式用于創(chuàng)建單個對象,而抽象工廠用于批量創(chuàng)建產(chǎn)品。
4、抽象工廠模式結構與實現(xiàn)
抽象工廠模式的結構
抽象工廠模式包含以下角色:
- AbstractFactory:抽象工廠接口,用于創(chuàng)建抽象產(chǎn)品對象。
- ConcreteFactory:具體工廠實現(xiàn),實現(xiàn)抽象工廠接口。
- AbstractProduct:抽象產(chǎn)品接口,定義產(chǎn)品規(guī)范。
- Product:具體產(chǎn)品實現(xiàn),實現(xiàn)抽象產(chǎn)品接口。
- Client:使用不同具體工廠和產(chǎn)品的客戶。
抽象工廠模式的實現(xiàn)
我們用一個汽車制造的例子來說明抽象工廠的實現(xiàn)。這里的產(chǎn)品分為兩大類,豪華品牌和普通品牌,每個品牌都有對應的轎車和越野車產(chǎn)品。
定義抽象工廠和產(chǎn)品接口:
interface AbstractFactory {
createSedan(): Sedan;
createSUV(): SUV;
}
interface Sedan {
showInfo(): void;
}
interface SUV {
showInfo(): void;
}
實現(xiàn)具體工廠:
class LuxuryFactory implements AbstractFactory {
createSedan() {
return new LuxurySedan();
}
createSUV() {
return new LuxurySUV();
}
}
class NormalFactory implements AbstractFactory {
createSedan() {
return new NormalSedan();
}
createSUV() {
return new NormalSUV();
}
}
實現(xiàn)具體產(chǎn)品:
class LuxurySedan implements Sedan {
showInfo() {
console.log('展示豪華轎車信息');
}
}
class LuxurySUV implements SUV {
showInfo() {
console.log('展示豪華 SUV 信息');
}
}
客戶端代碼:
const factory = new LuxuryFactory();
const sedan = factory.createSedan();
const suv = factory.createSUV();
sedan.showInfo();
suv.showInfo();
這樣客戶可以非常方便地切換不同的工廠來獲取產(chǎn)品,而不需要關心產(chǎn)品的具體實現(xiàn)。
5、抽象工廠模式的優(yōu)缺點分析
使用抽象工廠模式帶來的優(yōu)點包括:
- 封裝了具體產(chǎn)品的創(chuàng)建過程,客戶端無需知道實現(xiàn)
- 可以靈活切換不同的產(chǎn)品組合,提高了靈活性
- 易于增加新產(chǎn)品,滿足開閉原則
- 抽象層實現(xiàn)了解耦,防止源碼泄露
但是也存在一些缺點:
- 過度使用會增加系統(tǒng)的復雜性
- 增加新的產(chǎn)品時,需要修改抽象工廠和所有具體工廠
- 產(chǎn)品無法實現(xiàn)繼承擴展,都在抽象層定義
所以使用時需要權衡靈活性和復雜性之間的關系,適度使用抽象工廠模式。
6、抽象工廠模式應用于什么場景
抽象工廠模式應用的主要場景包括:
- 當需要創(chuàng)建的對象是一組相關的產(chǎn)品族時,如電器包含電視、洗衣機等
- 系統(tǒng)需要多個產(chǎn)品系列,而使用者只需要使用其中某一系列的產(chǎn)品時,如不同品牌的家電
- 當需要屏蔽用戶與產(chǎn)品的具體實現(xiàn)時,使得用戶不依賴產(chǎn)品類代碼時
- 當產(chǎn)品類經(jīng)常變更,而不想影響使用者時
- 當提供一個產(chǎn)品類庫,而只想顯示其中部分產(chǎn)品時
- 需要生成不同平臺下的程序時,如Windows、Linux等
在這些情況下,使用抽象工廠模式可以帶來很大的靈活性,使得用戶可以方便切換不同的產(chǎn)品,而不需要修改已有代碼。
抽象工廠模式通過提供一個創(chuàng)建一組相關對象的接口,將客戶端與對象的具體實現(xiàn)解耦,使得把兼容的對象組合在一起變得更加容易。當添加新的產(chǎn)品對象時,無需修改已有系統(tǒng),滿足開閉原則。
適用于需要創(chuàng)建一組相關的對象,提供最大化的靈活性和復用性的場景。但也要注意合理使用,過度使用會增加系統(tǒng)的復雜度。
7、總結
抽象工廠模式的主要優(yōu)點是封裝了對象的創(chuàng)建過程,提高了系統(tǒng)的靈活性,可以輕松切換不同的產(chǎn)品配置。使用者無需知道具體實現(xiàn)。另外它也符合開閉原則,容易擴展新產(chǎn)品。
缺點在于過度使用會增加系統(tǒng)的復雜性和抽象性。而且新增產(chǎn)品時需要修改抽象工廠接口,不太容易實現(xiàn)產(chǎn)品的繼承擴展。
主要適用于需要創(chuàng)建產(chǎn)品族的場景,需要屏蔽產(chǎn)品具體實現(xiàn)的場景,以及產(chǎn)品配置經(jīng)常變化的場景。
總體來說,抽象工廠模式在保持系統(tǒng)靈活性和可擴展性方面意義重大。但也需要權衡增加的抽象性帶來的復雜度。