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