В настоящее время я пытаюсь реализовать некоторые проектные структуры, и фабрика кажется наиболее подходящей, и что касается внедрения зависимостей, я предпочитаю внедрение конструктора. Однако возникает проблема, что не все мои продукты требуют одинаковых зависимостей, что нарушает шаблон...
Мой абстрактный метод Factory .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;
}
}