說明:
為避免了簡單工廠模式,對工廠類靜態方法的修改(對修改應該是封閉的)。
實作方式,將簡單工廠的工廠類靜態方法,再拆成不同的小子類。
註:其實我不了解,這跟略過工廠,直接 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;
}
}
*/
相關連結:設計模式整理列表
沒有留言:
張貼留言