很高兴又在每天的这个时候可以学习了,今天和大家分享一下我刚学习的设计模式工厂模式:
今天这个事例使用游戏里面的思想去做的,希望大家有兴趣。
工厂模式定义:
定义一个创建对象的接口,让子类决定实例化哪一个类,工厂方法让一个类的方法延迟到了其子类。
简单工厂VS抽象工厂:
简单工厂最大的好处在于在工厂中加入了逻辑判断,根据客户端变化动态创建具体的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式客户端需要决定实例化哪一个工厂来实现运算类,选择判断问题还是存在的,也就是说,工厂方法将简单工厂方法的逻辑判断移到了客户端,如果你想要增加功能,本来是改变工厂类的,现在变成客户端了。
不过有一点好处就是我会在后续将反射,通过反射我们就会体会到工厂模式的强大了。。。
现在我们来看看我用抽象工厂设计出来的一款创建游戏角色
先上两张图:
简单工厂
抽象工厂
怎么样,看晕了吧
对于第一个图我们也许很了解了,他就是我们所熟知的简单工厂设计模式,但是对于第二个图,大家是不是第一眼看上去就觉的很复杂呢,说实话这个图我看了3年了,开发项目也用到或多次,如果不是结合项目实战经验,看这个图还真的是晕。你比我幸运的是我今天可以在这给你讲,但我当时就是这样晕过来的。然后今天我又让这张图让你在晕一下。。。。
不过今天我会尽自己最大的努力让各位博友看清这个模式:
先介绍我们的主题类:
----------------------------------------------------------------------------------------------------------
英雄类:
先创建一个抽象工厂接口:
-------------------------------------------------------------------------------------------
人族英雄:
--------------------------------------------------------------------------------------------------
/// <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+"攻击怪物");
}
}
兽族英雄:
---------------------------------------------------------------------
精灵族英雄:
---------------------------------------------------------------------------------------
人族工厂:
-------------------------------------------------------------------------------------------------------
兽族工厂:
-------------------------------------------------------------------------------------------------------
精灵族工厂:
--------------------------------------------------------------------------------------------------------
客户端实现:
----------------------------------------------------------------------------------------------------------
运行以后效果如下:
哎呀呀,不容易啊,终于完了。。。。
时间也不早了,洗洗睡了,感谢大家对Darren博客的支持。www.tianboo.net