【发布时间】:2014-05-19 04:45:03
【问题描述】:
目前我正在尝试实现一些设计结构,工厂似乎最合适,就依赖注入而言,我更喜欢构造函数注入。但是问题出现了,并非我的所有产品都需要相同的依赖项,这与模式相混淆...
我的抽象工厂.get() 方法必须看起来像这样
abstract class AbstractSpellFactory
{
public abstract WCSpell get(SpellSubType sSubType,SpellCard,int a,int b,int c,int d);
}
为了完整起见,这里是我正在做/使用的上下文中的拼写类
public abstract class WCSpell
{
public abstract void CastSpell();
}
然后我可以像这样使用它
AbstractSpellFactory aSpellFactory = SpellFactory.createSpellFactory(SpellType.buff);
WCSpell spell = aSpellFactory.get(SpellSubType.Positive,sCard,1,2,3,4);//OK
spell.CastSpell();
aSpellFactory = SpellFactory.createSpellFactory(SpellType.rotate);
spell = aSpellFactory.get(SpellSubType.clockwise,sCard,0,0,0,0);//Non-used/Needed values...
spell.CastSpell();
所以这行得通,但最重要的是,旋转咒语不需要整数这一事实有点不雅,但最大的问题是如果我添加任何具有不同依赖关系的新咒语 AbstractSpellFactory.get(...) 方法参数参数只会变得更大,并且根据法术类型,它甚至可能不需要/没有传入的值。
所以我有点卡住了,有人有什么建议吗?
以上代码的伪实现
法术工厂类
static class SpellFactory
{
public static AbstractSpellFactory createSpellFactory( SpellType sType )
{
AbstractSpellFactory sFactory = null;
switch(sType)
{
case SpellType.kBuff:
{
sFactory = new SpellBuffFactory();
}
break;
case SpellType.kRotateClockWise:
{
sFactory = new SpellRotateFactory();
}
break;
}
return sFactory;
}
}
增益法术工厂
public class SpellBuffFactory : AbstractFactory
{
public override Spell get( SpellSubType sSubType,SpellCard sCard,int a,int b,int c,int d)
{
Spell spell = null;
switch(sSubType)
{
case Positive:
{
spell = new BuffSpell(a,b,c,d,sCard);
}
break;
case Negative:
{
spell = new BuffSpell(-a,-b,-c,-d,sCard);//some check to make sure all values are negative
}
}
return spell;
}
}
旋转法术工厂
public class SpellRotateFactory : AbstractFactory
{
public override Spell get( SpellSubType sSubType,SpellCard sCard,int a,int b,int c, int d)
{
Spell spell = null;
switch(sSubType)
{
case Clockwise:
{
spell = new WCRotateSpell(WCRotateSpell.RotationDirection.Clockwise,sCard);
}
break;
case CounterClockwise:
{
spell = new WCRotateSpell(WCRotateSpell.RotationDirection.CounterClockwise,sCard);
}
}
return spell;
}
}
【问题讨论】:
标签: c# design-patterns dependency-injection abstract-factory