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.
Достарыңызбен бөлісу: