您的位置:首页 > 编程语言 > Java开发

Abstract Factory Pattern(抽象工厂模式)——《深入浅出设计模式(C#/Java版)》

2009-09-25 14:47 549 查看
来源:《深入浅出设计模式(C#/Java版)》 莫勇腾 编著

哎,似乎越看越觉得糊涂了,先积累吧

定义:

  提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂(Abstract Factory)模式又称为Kit模式,属于对象创建型模式。

C#实例——大陆生态系统
using System;

namespace AnimalWorld
{
//抽象大陆工厂
abstract class ContientFactory
{
abstract public Herbivore CreateHerbivore();//食草动物
abstract public Carnivore CreateCarnivore();//食肉动物
}

//非洲大陆,有角马、狮子
class AfricaFactory : ContientFactory
{
override public Herbivore CreateHerbivore()
{
return new Wildebeest();//角马食草
}

override public Carnivore CreateCarnivore()
{
return new Lion();//狮子食肉
}
}

//美洲大陆,有狼、野牛
class AmericaFactory : ContientFactory
{
override public Herbivore CreateHerbivore()
{
return new Bison();//野牛食草
}
override public Carnivore CreateCarnivore()
{
return new Wolf();//狼食肉
}
}
//食草动物
abstract class Herbivore
{

}
//食肉动物
abstract class Carnivore
{
//猎食食草动物的方法
abstract public void Eat(Herbivore h);
}

//角马
class Wildebeest : Herbivore
{

}
//狮子
class Lion : Carnivore
{
//重写猎食食草动物的方法
override public void Eat(Herbivore h)
{
Console.WriteLine(this + " eats " + h);
}
}

//野牛
class Bison : Herbivore
{
}

//狼
class Wolf : Carnivore
{
//重写猎食食草动物的方法
override public void Eat(Herbivore h)
{
Console.WriteLine(this + " eats " + h);
}
}

//动物世界类
class AnimalWorld
{
private Herbivore herbivore;
private Carnivore carnivore;
//创建两种动物分类
public AnimalWorld(ContientFactory factory)
{
carnivore = factory.CreateCarnivore();
herbivore = factory.CreateHerbivore();
}

//运行食物链
public void RunFoodChain()
{
//食肉动物猎食食草动物
carnivore.Eat(herbivore);
}
}

/// <summary>
/// 抽象工厂模式客户应用测试
/// </summary>
class GameApp
{
[STAThread]
static void Main(string[] args)
{
//创建并运行非洲动物世界
ContientFactory africa = new AfricaFactory();
AnimalWorld world = new AnimalWorld(africa);
world.RunFoodChain();
//创建并运行美洲动物世界
ContientFactory america = new AmericaFactory();
world = new AnimalWorld(america);
world.RunFoodChain();
Console.Read();
}
}
}

输出:
AnimalWorld.Lion eats AnimalWorld.Wildebeest
AnimalWorld.Wolf eats AnimalWorld.Bison

主要优点:

  隔离了具体类的生成,使得客户不需要知道什么被创建了。
主要缺点:
  在添加新的产品对象时,难以扩展抽象工厂以便生产新种类的产品。
应用情景:
(1)       系统需要屏蔽有关对象如何创建、如何组织和如何表示。
(2)       系统需要由关联的多个对象来构成。
(3)       有关联的多个对象需要一起应用并且它们的约束是强迫的(不可分离)。
(4)       你想提供一组对象而不显示它们的实现过程,只显示它们的接口。
 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息