简单工厂模式---》工厂模式---》抽象工厂模式
抽象工厂模式与工厂模式一个大的区别就是工厂模式针对的是一个产品等级结构,而抽象工厂模式针对的时多个产品等级结构
其中的类与对象的关系是
抽象工厂:用于声明生成产品的工厂方法
具体工厂:实现生成产品的工厂方法
抽象产品:声明产品接口
具体产品:实现产品接口
客户:使用抽象产品和抽象工厂生成对象。创建抽象工厂
using System;
//抽象大陆工厂
abstract public class ContinentFactory//声明工厂方法
{
abstract public Herbivore CreateHerbivore();//抽象方法
abstract public Carnivore CreateCarnivore();
}
//具体非洲动物工厂
public class AfricaFactory:ContinentFactory//具体实现工厂方法
{
override public Herbivore CreateHerbivore()//具体实现方法,动态生成新的实例对象
{
return new Wildbeest();
}
override public Carnivore CreateCarnivore()
{
return new Lion();
}
}
//具体美洲动物工厂
public class AmericaFactory : ContinentFactory//具体实现工厂方法
{
override public Herbivore CreateHerbivore()//具体实现方法,动态生成新的实例对象
{
return new Bison();
}
override public Carnivore CreateCarnivore()
{
return new Wolf();
}
}
//抽象产品类 食草动物
abstract public class Herbivore
{
}
//抽象产品类 食肉动物
abstract public class Carnivore
{
abstract public void eat(Herbivore h);//抽象方法
}
//具体产品类-角马
public class Wildbeest:Herbivore
{
}
//具体产品类-野牛
public class Bison:Herbivore
{
}
//具体产品类-狼
public class Wolf:Carnivore
{
override public void eat(Herbivore h)//重载捕食的具体方法
{
Console.WriteLine("狼的话,会吃同样是AmericaFactory生产的野牛");
Console.WriteLine( this+ " eat " +h);
}
}
//具体产品类-狮子
public class Lion:Carnivore
{
override public void eat(Herbivore h)//重载捕食的具体方法
{
Console.WriteLine("狮子的话,会吃同样是AficaFactory生产的角马");
Console.WriteLine(this +" eat " +h);
}
}
//客户-创建抽象工厂
public class AnimalWorld
{
private Herbivore herbivore;
private Carnivore carnivore;
public AnimalWorld(ContinentFactory factory)//两个动物分裂 食草动物和食肉动物
{
herbivore = factory.CreateHerbivore();
carnivore = factory.CreateCarnivore();
}
public void RunFoodChain()//食肉动物捕食食草动物的食物链关系
{
carnivore.eat(herbivore);
}
}
//主程序
class test
{
static void Main()
{
//创建一个非洲动物世界,并且运行食物链
ContinentFactory africa = new AfricaFactory();
AnimalWorld world = new AnimalWorld(africa);
Console.WriteLine("一个非洲动物世界被创建");
world.RunFoodChain();
//创建一个美洲动物世界,并且运行食物链
ContinentFactory america = new AmericaFactory();
world = new AnimalWorld(america);
Console.WriteLine("一个美洲动物世界被创建");
world.RunFoodChain();
Console.ReadLine();
}
}
运行结果