一、什麼是抽象工廠模式
抽象工廠模式(Abstract Factory)是一種創建型設計模式,它允許客戶端創建一組相關或依賴對象的分組,而無需指定它們具體的類。這是通過提供一個介面來創建一組相關對象,而不是通過直接實例化的方式來實現的。
二、抽象工廠模式實現
抽象工廠模式實現有以下幾個關鍵角色:
- 抽象工廠(Abstract Factory):定義了一個用於創建一系列相關或相互依賴對象的介面。
- 具體工廠(Concrete Factory):實現抽象工廠介面,具體負責創建產品對象。
- 抽象產品(Abstract Product):定義了產品對象的介面,為各種具體產品提供統一的抽象。
- 具體產品(Concrete Product):實現抽象產品介面,定義了具體產品的屬性和功能。
以下是使用抽象工廠模式創建一組相關對象的代碼示例:
// 抽象工廠介面 interface AbstractFactory { createProductA(): AbstractProductA; createProductB(): AbstractProductB; } // 具體工廠,創建一組具體產品 class ConcreteFactory1 implements AbstractFactory { createProductA(): AbstractProductA { return new ConcreteProductA1(); } createProductB(): AbstractProductB { return new ConcreteProductB1(); } } class ConcreteFactory2 implements AbstractFactory { createProductA(): AbstractProductA { return new ConcreteProductA2(); } createProductB(): AbstractProductB { return new ConcreteProductB2(); } } // 抽象產品介面 interface AbstractProductA { methodA(): void; } interface AbstractProductB { methodB(): void; } // 具體產品實現 class ConcreteProductA1 implements AbstractProductA { methodA(): void { console.log('具體產品A1的方法A'); } } class ConcreteProductA2 implements AbstractProductA { methodA(): void { console.log('具體產品A2的方法A'); } } class ConcreteProductB1 implements AbstractProductB { methodB(): void { console.log('具體產品B1的方法B'); } } class ConcreteProductB2 implements AbstractProductB { methodB(): void { console.log('具體產品B2的方法B'); } } // 客戶端代碼示例 class Client { private abstractProductA: AbstractProductA; private abstractProductB: AbstractProductB; constructor(factory: AbstractFactory) { this.abstractProductA = factory.createProductA(); this.abstractProductB = factory.createProductB(); } run(): void { this.abstractProductA.methodA(); this.abstractProductB.methodB(); } } const client1 = new Client(new ConcreteFactory1()); client1.run(); const client2 = new Client(new ConcreteFactory2()); client2.run();
我們定義了一個抽象工廠介面和四個具體的類,它們分別是兩個具體工廠類和兩個具體產品類。我們通過客戶端代碼調用不同的具體工廠創建一組相關的具體產品並使用它們的方法。
三、抽象工廠模式的優缺點
優點:
- 抽象工廠模式將對象的創建和使用分離開來,客戶端無需知道具體產品的類名,可以使用相同的代碼處理不同的產品。
- 抽象工廠模式可以保證一組產品的完整性,避免了應用程序使用不完整的產品組合。
- 抽象工廠模式支持開閉原則,可以在不影響客戶端代碼的情況下增加新的產品族。
缺點:
- 抽象工廠模式在添加新產品族時需要修改抽象工廠介面及其所有實現類,可能會導致一定的代碼繁瑣度和系統的複雜度。
- 抽象工廠模式對於產品族中擴展新產品的需求支持不夠靈活,可能需要更改所有已有的代碼,應該避免頻繁的產品擴展。
四、抽象工廠模式的適用場景
- 一個系統需要多個產品系列,而這些產品系列之間具有相關性或依賴性。
- 系統最終需要使用的產品族對象是由輸入決定的。
- 客戶端代碼不應依賴於具體產品類,而是應該使用抽象工廠介面和抽象產品介面。
- 需要遵循開閉原則,增加新的產品族應該對系統的其他部分沒有影響。
五、總結
抽象工廠模式是一種創建型設計模式,允許客戶端使用一組相關或依賴的對象,而無需指定具體的類。它通過提供一個介面來創建一組相關的對象,而不是通過直接實例化的方式來實現這一目的。
抽象工廠模式最重要的角色是抽象工廠和具體工廠,它們分別負責定義創建產品的介面和創建一組具體產品。而抽象產品和具體產品則負責定義產品功能和實現這些功能。
抽象工廠模式的優點包括對象的創建與使用的解耦,保證產品的完整性和開閉原則的支持等。然而,它也存在修改抽象工廠和改動全部實現類的缺點,對於頻繁的產品擴展需要慎重使用。
原創文章,作者:NOUTU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333045.html