Порождающие шаблоны проектирования


Реализация шаблона «Фабричный метод»



бет5/15
Дата01.10.2022
өлшемі254,47 Kb.
#41019
1   2   3   4   5   6   7   8   9   ...   15

Реализация шаблона «Фабричный метод»


Рассмотрим оба варианта шаблона на примере создания различных типов воинов.

Пример реализации для обобщённого конструктора


Диаграмма классов будет выглядеть следующим образом:

Рисунок 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.


Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9   ...   15




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет