文章出處

一、抽象工廠模式

在工廠方法中, 所創建的汽車都是沒有品牌的汽車. 現在假設, 車子有品牌了, 并且不止只有汽車, 還有自行車的生產. 那么可以把汽車和自行車做成兩個抽象產品, 代碼如下:

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();
        }
    }
}

在工廠內部根據參數自行判斷生產那種品牌的產品.

以上的方式, 當然還可以加入配置文件和反射來增加其擴展行, 思路與之前工廠模式的相同, 就不過多介紹了.

 

三、個人理解

工廠方法模式, 我覺得有點像是創建一條進程, 至于進程中是什么樣的, 并不關注. 就像從深圳去上海, 可以選擇坐飛機, 火車, 甚至輪船.

而抽象工廠, 感覺像是創建預期的進程, 進程中已經規劃好了要創建的線程, 包括這些線程是做什么用的. 

 

參考:

  Abstract Factory Pattern

  大話設計模式


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()