发布时间:2016-10-30责任编辑:朱明 浏览:1137
简单工厂模式,是我们在软件开发过程中经常会使用的一种设计模式。所谓简单工厂,是说使用一个单独的类,即“简单工厂类”,来负责创造一系列对象实例的过程,行使“工厂”的职责。
以跑酷项目为例,在玩家与Boss交战的过程中,Boss每次出招攻击,都需要玩家做出相应的操作,来进行破招,从而躲避Boss的攻击或是进行反击。Boss的每个攻击招式,都对应了不同的破解方式,这就形成了一系列Boss攻击——玩家破招的攻防策略。例如,
(1) 当Boss攻击下方时,需要玩家上滑跳起躲避;
(2) 当Boss攻击上方时,需要玩家下滑俯身躲避;
(3) 当Boss攻击中间时,需要玩家左滑或右滑向两侧躲避;
根据以上情况,Boss每次发动攻击,我们都需要判定玩家做出的操作是否能够化解这次攻击,这部分逻辑判定工作就交给策略类对象去处理。每个不同的策略子类对应处理不同的判定逻辑,有多少种攻击——破招策略,就有多少个不同的策略子类。而我们的简单工厂类,就负责根据Boss每次攻击传入的参数,来创建对应的策略类对象,调用其中的逻辑判定函数,返回执行的结果。根据这个结果,我们便能够得知玩家是否成功应对了Boss的攻击。它的结构图如下所示:
其中,策略基类作为这一系列对象的基类,代码如下所示:
public class Strategy
{
Public virtual bool GetResult()
{
bool result = false;
return result;
}
}
然后,在具体的策略子类中,分别重写获取判定结果的方法:
public class StrategyA:Strategy
{
public override bool GetResult()
{
bool result = false;
if (如果玩家跳起)
{
result = true;
}else
{
result = false;
}
return result;
}
}
public class StrategyB:Strategy
{
public override bool GetResult()
{
bool result = false;
if (如果玩家下滑)
{
result = true;
}else
{
result = false;
}
return result;
}
}
public class StrategyC:Strategy
{
public override float GetResult()
{
bool result = false;
if (如果玩家左移或右移)
{
result = true;
}else
{
result = false;
}
return result;
}
}
简单策略工厂类:
public class StrategyFactory
{
public static Strategy CreateStrategy(strategy)
{
Strategy stra = null;
switch(strategy)
{
case StrategyA:
stra = new StrategyA();
break;
case StrategyB:
stra = new StrategyB();
break;
case StrategyC:
stra = new StrategyC();
break;
}
return stra;
}
}
使用简单工厂模式,使得客户端类不需要关心具体的对象实例化过程,只要根据自己的需要,将参数传递给简单工厂类负责创建实例的方法,通过方法内的判断分支,返回对应的对象实例。之后根据多态的方式,执行对象实例的处理方法。这大大降低了客户端类对具体类的依赖。并且,当我们需要修改时,只需要改变传递给工厂方法的参数即可。
面对扩展,我们需要做的是编写更多的子类,以及在工厂方法中添加更多的条件判断分支,就可以了。但是,在工厂方法中添加条件判断分支的做法,违反了开放-封闭原则(对扩展开发,对修改封闭),这使得原有的其它判断分支也受到了影响,这也正是简单工厂模式的缺点所在。
针对简单工厂模式的缺点,还有工厂方法模式、抽象工厂模式等不同的设计模式来进行改进与完善。这些模式在我们的跑酷项目中也有着不同的应用,让我们后面再继续深入探讨吧。
战国工作室 供稿