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

抽象工厂模式(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);
            }
        }

    }
}

三、运行结果

 

四、模式评价

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

 

posted @ 2014-11-10 23:05  Slark.NET  阅读(1463)  评论(0编辑  收藏  举报