[置顶] 软件开发模式之工厂模式模拟魔兽英雄创建(Darren)

很高兴又在每天的这个时候可以学习了,今天和大家分享一下我刚学习的设计模式工厂模式:吐舌头

今天这个事例使用游戏里面的思想去做的,希望大家有兴趣。

工厂模式定义:

定义一个创建对象的接口,让子类决定实例化哪一个类,工厂方法让一个类的方法延迟到了其子类。

简单工厂VS抽象工厂:

简单工厂最大的好处在于在工厂中加入了逻辑判断,根据客户端变化动态创建具体的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式客户端需要决定实例化哪一个工厂来实现运算类,选择判断问题还是存在的,也就是说,工厂方法将简单工厂方法的逻辑判断移到了客户端,如果你想要增加功能,本来是改变工厂类的,现在变成客户端了。

不过有一点好处就是我会在后续将反射,通过反射我们就会体会到工厂模式的强大了。。。得意

现在我们来看看我用抽象工厂设计出来的一款创建游戏角色

先上两张图:

简单工厂

抽象工厂

[置顶] 软件开发模式之工厂模式模拟魔兽英雄创建(Darren)_第1张图片

怎么样,看晕了吧

对于第一个图我们也许很了解了,他就是我们所熟知的简单工厂设计模式,但是对于第二个图,大家是不是第一眼看上去就觉的很复杂呢,说实话这个图我看了3年了,开发项目也用到或多次,如果不是结合项目实战经验,看这个图还真的是晕。你比我幸运的是我今天可以在这给你讲,但我当时就是这样晕过来的。大笑然后今天我又让这张图让你在晕一下。。。。偷笑

不过今天我会尽自己最大的努力让各位博友看清这个模式:

先介绍我们的主题类:

----------------------------------------------------------------------------------------------------------

英雄类:

 /// <summary>
    /// 模拟游戏中的英雄操作
    /// </summary>
    public abstract class YinXiong
    {
        private int blood;
        /// <summary>
        /// 英雄血量,不同种族英雄的血量不一样 ...只是为了演示,其余的属性根据游戏复杂度决定,就不多写了,你还可以定义攻击力,防御力...
        /// </summary>
        public int Blood
        {
            get { return blood; }
            set { blood = value; }
        }

        /// <summary>
        /// 英雄被攻击
        /// </summary>
        public abstract void Tracked();
        /// <summary>
        /// 英雄加血
        /// </summary>
        public abstract void AddBlood();
        /// <summary>
        /// 英雄攻击怪物
        /// </summary>
        public abstract void Beat();
    }

先创建一个抽象工厂接口:

-------------------------------------------------------------------------------------------

 /// <summary>
    /// 负责创建具体的英雄
    /// </summary>
    public interface IFactory
    {
        YinXiong CreateHero();
    }


人族英雄:

--------------------------------------------------------------------------------------------------

  /// <summary>
    /// 具体的人族英雄类
    /// </summary>
    class RenZhuYingXiong:YinXiong
    {
        //用来区分不同族
        string type = "人族英雄";
        /// <summary>
        /// 英雄被攻击
        /// </summary>
        public override void Tracked()
        {
            Console.WriteLine(type+"被攻击");
        }
        /// <summary>
        /// 英雄加血
        /// </summary>
        public override void AddBlood()
        {
            Console.WriteLine(type+"加血");
        }
        /// <summary>
        /// 英雄攻击怪物
        /// </summary>
        public override void Beat()
        {
            Console.WriteLine(type+"攻击怪物");
        }
    }

兽族英雄:

---------------------------------------------------------------------

/// <summary>
    /// 具体的兽族英雄
    /// </summary>
    class ShouZuYingXiong:YinXiong
    {
        //用来区分不同族
        string type = "兽族英雄";
        /// <summary>
        /// 英雄被攻击
        /// </summary>
        public override void Tracked()
        {
            Console.WriteLine(type + "被攻击");
        }
        /// <summary>
        /// 英雄加血
        /// </summary>
        public override void AddBlood()
        {
            Console.WriteLine(type + "加血");
        }
        /// <summary>
        /// 英雄攻击怪物
        /// </summary>
        public override void Beat()
        {
            Console.WriteLine(type + "攻击怪物");
        }
    }


精灵族英雄:

---------------------------------------------------------------------------------------

/// <summary>
    /// 精灵族
    /// </summary>
    class JinLingYingXiong:YinXiong
    {
        //用来区分不同族
        string type = "精灵族英雄";
        /// <summary>
        /// 英雄被攻击
        /// </summary>
        public override void Tracked()
        {
            Console.WriteLine(type + "被攻击");
        }
        /// <summary>
        /// 英雄加血
        /// </summary>
        public override void AddBlood()
        {
            Console.WriteLine(type + "加血");
        }
        /// <summary>
        /// 英雄攻击怪物
        /// </summary>
        public override void Beat()
        {
            Console.WriteLine(type + "攻击怪物");
        }
    }


人族工厂:

-------------------------------------------------------------------------------------------------------

/// <summary>
    /// 人族英雄工厂
    /// </summary>
    public class RenFacotry : IFactory
    {

        #region IFactory 成员

        public YinXiong CreateHero()
        {
            return new RenZhuYingXiong();
        }

        #endregion
    }


兽族工厂:

-------------------------------------------------------------------------------------------------------

/// <summary>
    /// 兽族工厂
    /// </summary>
    class ShouFactory:IFactory
    {
        #region IFactory 成员

        public YinXiong CreateHero()
        {
            return  new ShouZuYingXiong();
        }

        #endregion
    }


精灵族工厂:

--------------------------------------------------------------------------------------------------------

 public class JinLFactory:IFactory
    {

        #region IFactory 成员
        /// <summary>
        /// 创建精灵族英雄
        /// </summary>
        /// <returns></returns>
        public YinXiong CreateHero()
        {
            return new JinLingYingXiong();
        }

        #endregion
    }


客户端实现:

----------------------------------------------------------------------------------------------------------

class Program
    {
        public static void Main(string[] args)
        {
            IFactory heroFactory = new RenFacotry();
            ///创建具体的英雄
            YinXiong hero = heroFactory.CreateHero();
            hero.Blood = 5000;
            hero = PlayMethod(heroFactory, hero);

            ///创造具体的精灵族
            heroFactory = new JinLFactory();
            hero.Blood = 3000;

            hero = PlayMethod(heroFactory, hero);

            ///创建具体的兽族
            heroFactory = new ShouFactory();
            hero.Blood = 8000;
            hero = PlayMethod(heroFactory, hero);
            Console.Read();
        }

        private static YinXiong PlayMethod(IFactory heroFactory, YinXiong hero)
        {
            Console.WriteLine("---------------------------------------------------\n------------------------------------------------------");
            hero = heroFactory.CreateHero();
            hero.Blood = 5000;
            hero.Beat();
            hero.Tracked();
            hero.AddBlood();
            return hero;
        }
    }


运行以后效果如下:

[置顶] 软件开发模式之工厂模式模拟魔兽英雄创建(Darren)_第2张图片

哎呀呀,不容易啊,终于完了。。。。微笑

时间也不早了,洗洗睡了,感谢大家对Darren博客的支持。www.tianboo.net

你可能感兴趣的:(设计模式,游戏,String,Class,interface,产品)