工廠方法模式角色分配:
interface IFactory //工廠接口 { IProduct GetProduct(); } //A工廠類 public class FactoryA: IFactory { IProduct productA; public FactoryA() { this.productA = new ProductA(); } public IProduct GetProduct() //A工廠生產A產品 { return this.productA; } } //B工廠類 public class FactoryB : IFactory { IProduct productB; public FactoryB() { this.productB = new ProductB(); } public IProduct GetProduct() //B工廠生產B產品 { return this.productB; } } //產品接口 public interface IProduct { //產品方法 //...... } //產品A public class ProductA : IProduct { //產品屬性 //...... } //產品B public class ProductB : IProduct { //產品屬性 //...... } //調用 Ifactory factoryA =new factoryA(); Iproduct pa=factory.GetProduct(); Iproduct pb=factory.GetProduct();
工廠方法模式優缺點
在工廠方法模式中,核心工廠類不在負責產品的創建,而是將具體的創建工作交給子類去完成。也就是後所這個核心工廠僅僅只是提供創建的接口,具體實現方法交給繼承它的子類去完成。當我們的系統需要增加其他新功能時,只需要創建對應工廠和產品即可,這樣很好地符合了「開放-封閉「原則。
雖然工廠方法模式滿足了"開放-封閉」原則,但是這個模式也仍然有缺點:每次增加一個產品時,都需要增加一個具體類和對象實現工廠,是的系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。
開放封閉原則(Open Closed Principle)描述
符合開放封閉原則的模塊都有兩個主要特性:
1. 它們 "面向擴展開放(Open For Extension)"。
也就是說模塊的行爲是能夠被擴展的。當應用程序的需求變化時,我們可以使模塊表現出全新的或與以往不同的行爲,以滿足新的需求。
2. 它們 "面向修改封閉(Closed For Modification)"。
模塊的源代碼是不能被侵犯的,任何人都不允許修改已有源代碼。
仔細觀察這段代碼,在工廠模式中,已經將工廠類分開,不再將所有產品在同一工廠中生產,這樣就解決了簡單工廠中不停的switch case的問題。如果說來了一個C產品,那麼我們只需要寫一個C工廠和C產品,在調用時用C工廠生產C產品即可,A和B工廠和產品完全不受影響。OK,優化說完了,但是還是有問題。
問題在哪裏呢?當業務需求是需要生產產品族的時候,工廠就不再適合了。首先我們搞清楚何謂產品族和產品等級結構。舉個例子來說,比如三星是一個品牌,三星生產洗衣機,電視,冰箱;格力也是一個品牌,格力也生產洗衣機,電視,冰箱。那麼,三星工廠和格力工廠生產的2個品牌的洗衣機,就在洗衣機這種產品的產品等級結構中(當然洗衣機產品等級結構中還有LG,海爾,三菱等等不同的品牌的工廠的產品),所以,洗衣機就是一個產品等級。那麼三星生產的三星洗衣機,三星電視機,三星冰箱就是三星這個工廠的產品族。可能還會有西門子工廠產品族,格力工廠產品族,美的工廠產品族等等。
(也就是說我們的前提是工廠只有一種,但它可以生成多種產品,若要不同的工廠,則這種設計模式不符合)