很高兴又在每天的这个时候可以学习了,今天和大家分享一下我刚学习的设计模式工厂模式:
今天这个事例使用游戏里面的思想去做的,希望大家有兴趣。
工厂模式定义:
定义一个创建对象的接口,让子类决定实例化哪一个类,工厂方法让一个类的方法延迟到了其子类。
简单工厂VS抽象工厂:
简单工厂最大的好处在于在工厂中加入了逻辑判断,根据客户端变化动态创建具体的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式客户端需要决定实例化哪一个工厂来实现运算类,选择判断问题还是存在的,也就是说,工厂方法将简单工厂方法的逻辑判断移到了客户端,如果你想要增加功能,本来是改变工厂类的,现在变成客户端了。
不过有一点好处就是我会在后续将反射,通过反射我们就会体会到工厂模式的强大了。。。
现在我们来看看我用抽象工厂设计出来的一款创建游戏角色
先上两张图:
简单工厂
抽象工厂
怎么样,看晕了吧
对于第一个图我们也许很了解了,他就是我们所熟知的简单工厂设计模式,但是对于第二个图,大家是不是第一眼看上去就觉的很复杂呢,说实话这个图我看了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博客的支持。www.tianboo.net