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


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



бет13/15
Дата01.10.2022
өлшемі254,47 Kb.
#41019
1   ...   7   8   9   10   11   12   13   14   15
Байланысты:
Шаблоны проектирования (порождающие) (1)

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


Диаграмма классов:

Рисунок 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
әкімшілігінің қараңыз

    Басты бет