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


Классический вариант фабричного метода



Pdf көрінісі
бет4/15
Дата16.10.2022
өлшемі0,66 Mb.
#43481
1   2   3   4   5   6   7   8   9   ...   15
Классический вариант фабричного метода, когда интерфейс фабричных методов объявляется в 
независимом классе-фабрике, а их реализация определяется конкретными подклассами этого 
класса. 
Рисунок 3 
Пример классического фабричного метода 
Исходный код для данной диаграммы выглядит следующим образом: 
public abstract class Creator 

public abstract Product FactoryMethod(); 

public class CreatorForProduct1 : Creator 

public override Product FactoryMethod() 

return new Product1(); 


public class CreatorForProduct2 : Creator 



public override Product FactoryMethod() 

return new Product2(); 


public abstract class Product 


public class Product1 : Product 


public class Product2 : Product 


Реализация шаблона «Фабричный метод» 
Рассмотрим оба варианта шаблона на примере создания различных типов воинов.
Пример реализации для обобщённого конструктора 
Диаграмма классов будет выглядеть следующим образом: 
Рисунок 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
әкімшілігінің қараңыз

    Басты бет