一、抽象工廠模式 在工廠方法中, 所創建的汽車都是沒有品牌的汽車. 現在假設, 車子有品牌了, 並且不止只有汽車, 還有自行車的生產. 那麼可以把汽車和自行車做成兩個抽象產品, 代碼如下: 為什麼要把產品做成抽象的呢, 因為雖然各品牌的產品大體相同, 但是其中很多細節還是不一樣的. 所以就產生了兩種 ...
一、抽象工廠模式
在工廠方法中, 所創建的汽車都是沒有品牌的汽車. 現在假設, 車子有品牌了, 並且不止只有汽車, 還有自行車的生產. 那麼可以把汽車和自行車做成兩個抽象產品, 代碼如下:
public abstract class NormalCar { public abstract void Start(); } public abstract class Bike { public abstract void Run(); }
為什麼要把產品做成抽象的呢, 因為雖然各品牌的產品大體相同, 但是其中很多細節還是不一樣的. 所以就產生了兩種抽象產品, 汽車和自行車.
接下來就是各品牌自己的產品了, 此處假設品牌為 長城和哈弗, 代碼如下:
public class ChangChengNormal : NormalCar { public override void Start() { Console.WriteLine("長城汽車, 鑰匙啟動"); } } public class ChangChengBike : Bike { public override void Run() { Console.WriteLine("長城自行車, 兩隻腳登"); } } //------------------------------------------------------------- public class HaFuNormal : NormalCar { public override void Start() { Console.WriteLine("哈弗汽車, 無鑰匙啟動"); } } public class HaFuBike : Bike { public override void Run() { Console.WriteLine("哈弗自行車, 電動輔助"); } }
從產品這邊來看, 長城,哈弗都生產自行車和汽車, 並且各自生產的還有些不同, 或者是形狀不同, 或者是價格不同, 又或者是功能不同. 等等.
產品設計已完成, 接下來要投入到廠房生產. 各品牌的車, 肯定不是在同一個廠生產出來, 提取他們共同部分, 形成一個廠的抽象類. 就是抽象工廠了, 代碼如下:
public abstract class AbstractCarFactory { public abstract NormalCar CreateNormal(); public abstract Bike CreateBike(); }
在一個品牌的工廠中, 既要生產汽車, 也要生產自行車, 當然可能不是同一個廠房出來的, 這裡並不關註這個, 而且, 抽象工廠生產的, 是一個產品族, 而不是一個個品牌.
既然抽象工廠已經出現, 那麼各品牌就可以按照這個工廠模板去建立自己的工廠了, 自己的東西, 咱要自己造.
public class ChangChengFactory : AbstractCarFactory { public override NormalCar CreateNormal() { return new ChangChengNormal(); } public override Bike CreateBike() { return new ChangChengBike(); } } public class HaFuFactory : AbstractCarFactory { public override NormalCar CreateNormal() { return new HaFuNormal(); } public override Bike CreateBike() { return new HaFuBike(); } }
做到這裡, 抽象工廠就基本完成了, 接下來, 我們來生產一輛汽車和一輛自行車:
AbstractCarFactory abFac = new ChangChengFactory(); NormalCar normal = abFac.CreateNormal(); Bike suv = abFac.CreateBike(); normal.Start(); suv.Run();
類圖:
二、用簡單工廠來修改抽象工廠
很多時候不需要這麼複雜的過程, 如果項目為定製化的, 並非一個產品, 不需要那麼強的擴展性, 也可以使用以下的方式:
public class CarFac { public static NormalCar CreateNormal(string brand) { switch (brand) { case "ChangCheng": return new ChangChengNormal(); case "HaFu": return new HaFuNormal(); default: return new ChangChengNormal(); } } public static Bike CreateBike(string brand) { switch (brand) { case "ChangCheng": return new ChangChengBike(); case "HaFu": return new HaFuBike(); default: return new ChangChengBike(); } } }
在工廠內部根據參數自行判斷生產那種品牌的產品.
以上的方式, 當然還可以加入配置文件和反射來增加其擴展行, 思路與之前工廠模式的相同, 就不過多介紹了.
三、個人理解
工廠方法模式, 我覺得有點像是創建一條進程, 至於進程中是什麼樣的, 並不關註. 就像從深圳去上海, 可以選擇坐飛機, 火車, 甚至輪船.
而抽象工廠, 感覺像是創建預期的進程, 進程中已經規劃好了要創建的線程, 包括這些線程是做什麼用的.
參考:
大話設計模式