自《工廠模式三部曲之一_簡單工廠模式》之后,貌似已經很久沒有繼續這個三部曲了,所以抽點時間把后兩篇給補上吧。首先回顧下簡單工廠模式的主要內容:簡單工廠模式就是實質就是專門定義了一個工廠類,利用工廠類的靜態方法來根據用戶需求創建對象,優點是客戶端的壓力較小,客戶端不需要做創建實例的操作,只需要調用工廠類中的方法就可以獲得對應實例,而其缺點也非常明顯,其所有創建工作都在一個工廠類完成,耦合性較高,而且當系統需要增加或者修改產品時需要改動工廠類,既不符合單一職責的原則也不符合開放-關閉原則,所以就出現了工廠模式。
工廠模式
工廠模式是對簡單工廠模式的進一步抽象化,是簡答工廠模式的衍生,根據設計模式的基本原則也是設計模式的精髓“封裝變化點”,即哪里發生改變就把哪里封裝起來,所以工廠模式對簡單工廠中的工廠類做了一個封裝,使其滿足單一職責和開放-關閉原則。
【解決問題】:簡單工廠模式中違背了單一職責和開放-關閉原則。
【核心思想】:建立一個抽象工廠的基類,給每個產品建立一個工廠,該工廠繼承之抽象工廠,規定每個產品都有特定的工廠來創建。
【角色】
抽象工廠角色:這是工廠模式的核心,它與應用程序無關,是具體工廠必須繼承的父類或者必須實現的接口
具體工廠角色:包含邏輯業務的代碼,由應用程序調用以創建對應的具體產品對象
抽象產品角色:具體產品必須繼承的父類或者必須實現的接口
具體產品角色:所創建的對象就是此角色的實例
下面仍舊以簡單工廠中的實例來講解,對其進行改造
【角色分析】
具體工廠:**類型衣服制造廠 每個衣服制造廠只負責一件衣服(高內聚) ,當然也就是說當沒有客戶需要的衣服的時候需要創建一個對應的工廠及一件衣服 由該工廠負責提供這件衣服 但是對於以前的工廠和衣服都沒有影響(這是設計模式所期望的--單一職責原則)
具體產品:**類型衣服 繼承抽象產品,當然可擴展自身特性
角色分析好了,就可以進行改造了,貼上改造完畢的各個部分代碼:
抽象工廠類:

2 public abstract class ClothFactory
3 {
4 public abstract Cloth CreateCloth();
5 }
該類中定義了一個抽象的CreateCloth()方法,用於創建衣服實例。
具體工廠類:

2 public class BusinessFactory : ClothFactory
3 {
4 public override Cloth CreateCloth()
5 {
6 return new BusinessCloth();
7 }
8 }
9
10 // 具體工廠2:運動裝工廠 只負責生產運動裝
11 public class SportFactory : ClothFactory
12 {
13 public override Cloth CreateCloth()
14 {
15 return new SportCloth();
16 }
17 }
18
19 // 具體工廠3:校服工廠 只負責生產校服
20 public class LifeFactory : ClothFactory
21 {
22 public override Cloth CreateCloth()
23 {
24 return new LifeCloth();
25 }
26 }
該類為核心,類中定義了BusinessFactory,SportFactory,LifeFactory三個工廠分別來創建商務裝,運動裝,校服,三個工廠都繼承之抽象工廠ClothFactory,並都重寫了抽象工廠中的CreateCloth()方法,分別用來創建該工廠生產的衣服,利用里氏替換原則(子類代替父類)來實現,這是產品需要改變(添加,修改,刪除)時,如添加,只需要添加一個專門生產該產品的工廠和該產品就可以了,添加操作對之前所有的工廠和產品沒有直接的影響。修改同理,只需要修改創建該產品的工廠類就可以了,很好的遵循了開放-關閉原則,同時一個工廠類創建一個產品,遵循了單一職責的原則。
抽象產品類:

2 public abstract class Cloth
3 {
4 public abstract void GetCloth();
5 }
該方法不需要作改變,仍舊定義了一個GetCloth()方法,模擬使用產品。
具體產品類:

2 class BusinessCloth : Cloth
3 {
4 public override void GetCloth()
5 {
6 Console.WriteLine( " 商務裝...... ");
7 }
8 }
9
10 // 定義具體產品2:運動裝
11 class SportCloth : Cloth
12 {
13 public override void GetCloth()
14 {
15 Console.WriteLine( " 運動裝....... ");
16 }
17 }
18
19 // 定義具體產品3:休閑服
20 class LifeCloth : Cloth
21 {
22 public override void GetCloth()
23 {
24 Console.WriteLine( " 休閑服........ ");
25 }
26 }
該類也不需要作任何改變,根據哪里封裝改變哪里,工廠類的封裝和產品沒有直接的影響,仍舊定義了三種類型的衣服,並重寫抽象產品中的抽象方法,因為每種產品都有自身特性,有自身獨特的功能。
客戶端:

2 class Program
3 {
4 static void Main( string[] args)
5 {
6 // 要求商務裝
7 Cloth c = new BusinessFactory().CreateCloth();
8 c.GetCloth();
9
10 // 要求運動裝
11 Cloth c2 = new SportFactory().CreateCloth();
12 c2.GetCloth();
13
14 Console.ReadKey();
15 }
16 }
運行效果:
優缺點總結:
優點:解決了簡單工廠中違背單一職責和開放-關閉原則問題,同時增加了程序的可擴展性,屏蔽了產品類。
缺點:1.邏輯判斷放在了客戶端進行
2.每添加一個產品都需要為它專門添加一個工廠用來生產,繁雜
3.每個工廠都只能生產一種產品,品種單一。