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


Реализация шаблона на базе обобщённого конструктора



Pdf көрінісі
бет12/15
Дата16.10.2022
өлшемі0,66 Mb.
#43481
1   ...   7   8   9   10   11   12   13   14   15
Байланысты:
Creational Patterns

Реализация шаблона на базе обобщённого конструктора 
Диаграмма классов:
Рисунок 11 
Диаграмма классов для шаблона «Прототип» на базе обобщённого конструктора 
Исходный код: 
public enum WarriorTypes 

Infantryman, 
Archer, 
Horseman 

public abstract class Warrior 



private WarriorTypes _warriorType; 
private static Hashtable _registry = new Hashtable(); 
protected Warrior(WarriorTypes parWarriorType) 

_warriorType = parWarriorType; 

public abstract Warrior Clone(); 
public static Warrior CreateWarrior(WarriorTypes parWarriorType) 

Warrior warrior = null; 
if (_registry.Contains(parWarriorType)) 

warrior = (Warrior)_registry[parWarriorType]; 
return warrior.Clone(); 

return warrior; 

protected void AddPrototype(Warrior parWarrior) 

_registry[parWarrior._warriorType] = parWarrior; 

protected void RemovePrototype(WarriorTypes parWarriorType) 

_registry.Remove(parWarriorType); 

public abstract string Info(); 

public class Infantryman : Warrior 

public Infantryman() 
: base(WarriorTypes.Infantryman) 

base.AddPrototype(this); 

public override Warrior Clone() 

Infantryman infantryman = new Infantryman(); 
return infantryman; 

public override string Info() { return "Infantryman"; } 

public class Archer : Warrior 

private int _arrousCount = 0; 
private static Archer _prototype; 
public Archer() 
: base(WarriorTypes.Archer) 

_arrousCount = 10; 
base.AddPrototype(this); 

public override Warrior Clone() 

Archer archer = new Archer(); 
archer._arrousCount = this._arrousCount; 
return archer; 

public override string Info() { return "Archer"; } 

public class Horseman : Warrior 

private Color _horseColor; 
public Horseman() 
: base(WarriorTypes.Horseman) 

_horseColor = Color.Black; 
base.AddPrototype(this); 

public override Warrior Clone() 

Horseman horseman = new Horseman(); 
horseman._horseColor = this._horseColor; 
return horseman; 

public override string Info() { return "Horseman"; } 



Пример использования: 
// Инициализация клонов 
Infantryman infantryman = new Infantryman(); 
Archer archer = new Archer(); 
Horseman horseman = new Horseman(); 
// Создание армии 
List army = new List(); 
army.Add(Warrior.CreateWarrior(WarriorTypes.Infantryman)); 
army.Add(Warrior.CreateWarrior(WarriorTypes.Archer)); 
army.Add(Warrior.CreateWarrior(WarriorTypes.Horseman)); 
В приведенной реализации классы всех создаваемых военных единиц, таких как лучники, 
пехотинцы и конница, являются подклассами абстрактного базового класса Warrior. В этом классе 
определен обобщенный конструктор в виде статического метода СreateWarrior. Передавая в этот 
метод в качестве параметра тип боевой единицы, можно создавать воинов нужных родов войск. 
Для этого обобщенный конструктор использует реестр прототипов, реализованный в виде хеша
каждый элемент которого представляет собой пару " тип воина" - "его прототип". 
Добавление прототипов в реестр происходит автоматически при создании экземпляра класса 
одного из типов воинов. При этом, если в реестре существует прототип данного типа, то он будет 
заменён на новый. 
Для приведенной реализации шаблона «Прототип» можно отметить следующие особенности: 
• Создавать новых воинов можно как при помощи обобщенного конструктора, так и 
непосредственно (при этом в реестре автоматически будут обновляться объекты-клоны); 
• Отсутствует недостаток реализации на базе обобщенного конструктора для шаблона 
«Фабричный метод», а именно базовый класс Warrior ничего не знает о своих подклассах. 


Достарыңызбен бөлісу:
1   ...   7   8   9   10   11   12   13   14   15




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

    Басты бет