抽象工厂模式(Abstract Factory)C#实例

本文出处http://www.dofactory.com/net/abstract-factory-design-pattern

一、场景描述

本实例描述了抽象工厂模式的一个使用场景。在动物世界弱肉强食,食肉动物会吃掉食草动物。这是动物世界的规律,因此在动物世界类中有Runfoodchain(运行食物链)方法。在动物世界里总是有食肉动物和食草动物这两个抽象成员。它们之所以是抽象成员是因为他们不是具体的一种动物。而食草动物与食肉动物的区别在于食肉动物有eat方法。为了在动物世界里构造这两个抽象成员,我们就需要大陆工厂这个抽象工厂。这个工厂是抽象的,因为我们不确定这个工厂应该创造怎样的食肉动物和食草动物。因此,在程序里我们选定了两个具体的工厂,非洲大陆工厂和美洲大陆工厂。由于地理位置确定了,那么在这个大陆的动物种类也就确定了,非洲有羚羊和狮子,美洲有野牛和狼。这样他们的食物链关系也就跟着确定了。

二、代码运行

在Visual Studio Express 2013 for Windows Desktop 下新建项目,选择 Visual C# -> 控制台应用程序,项目名字随意。然后在项目里创建一个类文件,命名为AbstractFactory.cs,复制如下代码即可运行。

using System;

namespace AbstractFactory
{
class AbstractFactory
{
/// <summary>
/// 主程序
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
ContinentFactory africa = new AfricaFactory();
AnimalWorld world = new AnimalWorld(africa);
world.RunFoodChain();
ContinentFactory america = new AmericaFactory();
world = new AnimalWorld(america);
world.RunFoodChain();
Console.ReadKey();
} /// <summary>
/// 食草动物
/// </summary>
abstract class Herbivore
{
}
/// <summary>
/// 野牛
/// </summary>
class Bison : Herbivore
{
}
/// <summary>
/// 羚羊
/// </summary>
class Wildebeest : Herbivore
{
}
/// <summary>
/// 食肉动物
/// </summary>
abstract class Carnivore
{
public abstract void Eat(Herbivore h);
}
/// <summary>
/// 狮子
/// </summary>
class Lion : Carnivore
{
public override void Eat(Herbivore h)
{
Console.WriteLine(this.GetType().Name + " eats " + h.GetType().Name);
}
}
/// <summary>
/// 狼
/// </summary>
class Wolf : Carnivore
{
public override void Eat(Herbivore h)
{
Console.WriteLine(this.GetType().Name + " eats " + h.GetType().Name);
}
}
/// <summary>
/// 大陆工厂
/// </summary>
abstract class ContinentFactory
{
public abstract Herbivore CreateHerbivore();
public abstract Carnivore CreateCarnivore();
}
/// <summary>
/// 非洲大陆工厂
/// </summary>
class AfricaFactory : ContinentFactory
{
public override Herbivore CreateHerbivore()
{
return new Wildebeest();
}
public override Carnivore CreateCarnivore()
{
return new Lion();
}
}
/// <summary>
/// 美洲大陆工厂
/// </summary>
class AmericaFactory : ContinentFactory
{
public override Herbivore CreateHerbivore()
{
return new Bison();
}
public override Carnivore CreateCarnivore()
{
return new Wolf();
}
}
/// <summary>
/// 动物世界
/// </summary>
class AnimalWorld
{
private Herbivore _herbivore;
private Carnivore _carnivore;
public AnimalWorld(ContinentFactory factory)
{
_carnivore = factory.CreateCarnivore();
_herbivore = factory.CreateHerbivore();
}
        
public void RunFoodChain()
{
_carnivore.Eat(_herbivore);
}
} }
}

三、运行结果

四、模式评价

工厂模式的好处就是当我们切换到别的大陆,只要实例化一个对应的工厂,产生这个大陆的食肉动物和食草动物,那么接下来的构造食物链等其他操作就又工厂及动物世界自己来完成了。

最新文章

  1. 软件工程-构建之法 Visual Studio开发平台的安装与单元测试
  2. 【2016-10-31】【坚持学习】【Day16】【MongoDB】【入门 -概念】
  3. 教你一招 - 如何给nopcommerce增加一个类似admin的area
  4. POJ 3061 Subsequence(尺取法)
  5. CSS样式优先级
  6. jq中如何阻止元素的默认行为?
  7. FreeModbus 移植于STM32 实现Modbus RTU通信
  8. 【转】iOS开发路线简述
  9. OpenStack运维(二):OpenStack计算节点的故障和维护
  10. 两种利用GCD实现分步获取结果的方式和SDWebImage缓存机制的验证
  11. 网络协议 终章 - GTP 协议:复杂的移动网络
  12. .Net基础——程序集与CIL
  13. P4610 [COCI2011-2012#7] KAMPANJA
  14. Scrapy 下载图片
  15. 学习总结javascript和ajax,php,和css
  16. Jackson注解简介
  17. Ionic3 新增 Service
  18. C++ 智能指针二
  19. (转)renren-fast解读(一)
  20. 【ASP.NET 进阶】TreeView控件学习

热门文章

  1. gitlab配置自动同步
  2. UVA-10791 数学
  3. powerdesigner中把表的描述复制到Name
  4. [吴恩达机器学习笔记]13聚类K-means
  5. [LeetCode] 24. Swap Nodes in Pairs ☆
  6. 解决VS Code编译调试中文输出乱码
  7. Visual Studio Code 如何编写运行 C、C++ 程序?
  8. bzoj 3261: 最大异或和 (可持久化trie树)
  9. Codeforces 807 C. Success Rate
  10. TreeSet的特性