2013年5月20日 星期一

設計模式:工廠方法模式 (Factory Method Pattern)

工廠方法模式 (Factory Method Pattern),以下程式碼以 C# 為例

說明:
為避免了簡單工廠模式,對工廠類靜態方法的修改(對修改應該是封閉的)。
實作方式,將簡單工廠的工廠類靜態方法,再拆成不同的小子類。

註:其實我不了解,這跟略過工廠,直接 new 實作的 class,有什麼差別。可能是我沒遇到適合的情況,遇到時,可能就會頓悟 XD


範例:
生產玩具車、玩具狗。


希望達成如下的效果
static void Main(string[] args)
{
    // 工廠方法模式寫法
    ToyFactory xx;
    Toy aa;

    xx = new ToyCarFactory();
    aa = xx.CreateToy();
    aa.MakeToy();//製造了 玩具車

    xx = new ToyDogFactory();
    aa = xx.CreateToy();
    aa.MakeToy();//製造了 玩具車


    /* 比較:簡單工單模式寫法
    Toy aa;
    aa = ToyFactory.CreateToy("car");
    aa.MakeToy();//製造了 玩具車

    aa = ToyFactory.CreateToy("dog");
    aa.MakeToy();//製造了 玩具狗
    */
    Console.ReadLine();
}
執行結果:
製造了 玩具車
製造了 玩具狗



實現重點在於,每個小工廠都有一個 CreateToy() 方法,能回傳同類型實際生產的物件。

其餘程式碼
abstract class Toy
{
    public abstract void MakeToy();
}

class ToyCar : Toy
{
    public override void MakeToy()
    {
        Console.WriteLine("製造了 玩具車");
    }
}

class ToyDog : Toy
{
    public override void MakeToy()
    {
        Console.WriteLine("製造了 玩具狗");
    }
}

// 工廠方法模式寫法
interface ToyFactory
{
    Toy CreateToy();
}

class ToyCarFactory : ToyFactory
{
    public Toy CreateToy()
    {
        return new ToyCar();
    }
}

class ToyDogFactory : ToyFactory
{
    public Toy CreateToy()
    {
        return new ToyDog();
    }
}

/* 比較:簡單工單模式寫法
class ToyFactory
{
    public static Toy CreateToy(String cc)
    {
        Toy obj = null;
        switch (cc)
        {
            case "car":
                obj = new ToyCar();
                break;
            case "dog":
                obj = new ToyDog();
                break;
            default:
                throw new Exception("沒有這個類別");

        }
        return obj;
    }
}
*/

相關連結:設計模式整理列表

沒有留言:

張貼留言