Реализация шаблона «Фабричный метод»
Рассмотрим оба варианта шаблона на примере создания различных типов воинов.
Пример реализации для обобщённого конструктора
Диаграмма классов будет выглядеть следующим образом:
Рисунок 4 Диаграмма классов для реализации создания воинов на базе обобщённого конструктора
Исходный код:
public enum WarriorTypes
{
Infantryman,
Archer,
Horseman
}
public abstract class Warrior
{
public abstract string Info();
public static Warrior CreateWarrior(WarriorTypes parWattiorType)
{
Warrior warrior = null;
switch (parWattiorType)
{
case WarriorTypes.Infantryman:
warrior = new Infantryman();
break;
case WarriorTypes.Archer:
warrior = new Archer();
break;
case WarriorTypes.Horseman:
warrior = new Horseman();
break;
}
return warrior;
}
}
public class Infantryman : Warrior
{
public override string Info()
{
return "Infantryman";
}
}
public class Archer : Warrior
{
public override string Info()
{
return "Archer";
}
}
public class Horseman : Warrior
{
public override string Info()
{
return "Horseman";
}
}
Пример создания армии из трёх воинов будет выглядеть следующим образом:
Warrior[] army = new Warrior[3];
army[0] = Warrior.CreateWarrior(WarriorTypes.Infantryman);
army[1] = Warrior.CreateWarrior(WarriorTypes.Archer);
army[2] = Warrior.CreateWarrior(WarriorTypes.Horseman);
foreach (Warrior elWarrior in army)
elWarrior.Info();
Представленный вариант шаблона «Фабричный метод» пользуется популярностью благодаря своей простоте. В нем статический фабричный метод CreateWarrior() определен непосредственно в полиморфном базовом классе Warrior. Этот фабричный метод является параметризированным, то есть для создания объекта некоторого типа в CreateWarrior() передается соответствующий идентификатор типа.
С точки зрения "чистоты" объектно-ориентированного кода у этого варианта есть следующие недостатки:
Так как код по созданию объектов всех возможных типов сосредоточен в статическом фабричном методе класса Warrior, то базовый класс Warrior обладает знанием обо всех производных от него классах, что является нетипичным для объектно-ориентированного подхода.
Подобное использование оператора switch (как в коде фабричного метода CreateWarrior()) в объектно-ориентированном программировании также не приветствуется.
Указанные недостатки отсутствуют в классической реализации паттерна Factory Method.
Достарыңызбен бөлісу: |