前面寫了簡單工廠模式跟工廠方法模式,照着以前的思路再來看抽象工廠模式覺得就沒啥新意了。從工廠方法模式的角度去分析,整體可分爲實體類跟工廠類兩大分支。其中實體部分由一個抽象類作爲基類,再加若干個子類;工廠類有一個藉口加若干個工廠子類組成。現在抽象方法就是在實體類這一分支上再加上一個並列的抽象類,以及相同結構的實現該抽象類的子類。
下面以實際代碼展開說明:
abstract class MountainAnimal
{
public abstract void Run();
public abstract void Jump();
}
class MountainCat : MountainAnimal
{
public override void Run()
{
Console.WriteLine("i am mountain cat i can run");
}
public override void Jump()
{
Console.WriteLine("i am mountain cat i can jump");
}
}
class MountainDog : MountainAnimal
{
public override void Run()
{
Console.WriteLine("i am mountain dog i can run");
}
public override void Jump()
{
Console.WriteLine("i am mountain dog i can jump");
}
}
abstract class GrassAnimal
{
public abstract void Run();
public abstract void Jump();
}
class GrassCat : GrassAnimal
{
public override void Run()
{
Console.WriteLine("i am grass cat i can run");
}
public override void Jump()
{
Console.WriteLine("i am grass cat i can jump");
}
}
class GrassDog : GrassAnimal
{
public override void Run()
{
Console.WriteLine("i am grass dog i can run");
}
public override void Jump()
{
Console.WriteLine("i am grass dog i can jump");
}
}
interface Factory
{
MountainAnimal CreateMountainAnimal();
GrassAnimal CreateGrassAnimal();
}
class CatFactory : Factory
{
public MountainAnimal CreateMountainAnimal()
{
return new MountainCat();
}
public GrassAnimal CreateGrassAnimal()
{
return new GrassCat();
}
}
class DogFactory : Factory
{
public MountainAnimal CreateMountainAnimal()
{
return new MountainDog();
}
public GrassAnimal CreateGrassAnimal()
{
return new GrassDog();
}
}
class Program
{
static void Main(string[] args)
{
Factory factory = new DogFactory();
MountainAnimal animal = factory.CreateMountainAnimal();
animal.Jump();
Console.ReadKey();
}
}
按照以前的思路是有一個動物類,其中有跑跟跳的方法,然後兩個子類貓跟狗,去具體的實現這兩個方法。現在是在原來的基礎上把動物這個抽象類改成山地動物跟草原動物這兩個並列的抽象類,其中的他們有共同的抽象方法。
這種方式跟工廠方法模式幾乎沒有區別,完全就是在一個思路上做的擴展。但是有一點就是你想再加上一個類別,比如溼地動物類,你又要再次在工廠類中修改代碼,這樣貌似形成一種惡性的循環,現在我還不明白怎麼解決這類問題。。。。。