很高兴又在每天的这个时候可以学习了,今天和大家分享一下我刚学习的设计模式工厂模式:
今天这个事例使用游戏里面的思想去做的,希望大家有兴趣。
工厂模式定义:
定义一个创建对象的接口,让子类决定实例化哪一个类,工厂方法让一个类的方法延迟到了其子类。
简单工厂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