介绍
工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建,具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题。
核心要点
“ 一个工厂具有生产多样东西的能力。”
接口或抽象类定义工厂的行为(这里有多个行为),具体工厂继承接口或抽象类去实现
例子
美洲和非洲动物园
using System;
namespace 抽象工厂例子
{
abstract class ContinetFactory
{
public abstract Herbivore CreateHerbivore();
public abstract Carnivore CreateCarnivore();
}
class AfricaFactory : ContinetFactory
{
public override Herbivore CreateHerbivore()
{
return new Wildebeest();
}
public override Carnivore CreateCarnivore()
{
return new Lion();
}
}
class AmericaFactory : ContinetFactory
{
public override Herbivore CreateHerbivore()
{
return new Bison();
}
public override Carnivore CreateCarnivore()
{
return new Wolf();
}
}
abstract class Herbivore
{
}
abstract class Carnivore
{
public abstract void Eat(Herbivore h);
}
class Wildebeest : Herbivore
{
}
class Lion : Carnivore
{
public override void Eat(Herbivore h)
{
Console.WriteLine(this.GetType().Name + " eats " + h.GetType().Name);
}
}
class Bison : Herbivore
{
}
class Wolf : Carnivore
{
public override void Eat(Herbivore h)
{
Console.WriteLine(this.GetType().Name + " eats " + h.GetType().Name);
}
}
class AnimalWorld
{
private Herbivore herbivore;
private Carnivore carnivore;
public AnimalWorld(ContinetFactory factory)
{
herbivore = factory.CreateHerbivore();
carnivore = factory.CreateCarnivore();
}
public void RunFoodChain()
{
carnivore.Eat(herbivore);
}
}
}