Пример реализации абстрактной фабрики
Рассмотрим пример реализации абстрактной фабрики для создания различных типов воинов. Сделаем классы создания армий двух разных стран: Рим и Карфаген. Для простоты, будем считать, что у каждой страны есть одинаковые типы воинов.
Диаграмма классов выглядит следующим образом:
Рисунок 7 Пример фабрики классов для создания армии из воинов
Исходный код:
public abstract class Warrior
{
public abstract string Info();
}
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";
}
}
public class RomanInfantryman : Infantryman
{
public override string Info()
{
return "RomanInfantryman";
}
}
public class RomanArcher : Archer
{
public override string Info()
{
return "RomanArcher";
}
}
public class RomanHorseman : Horseman
{
public override string Info()
{
return "RomanHorseman";
}
}
public class CarthaginianInfantryman : Infantryman
{
public override string Info()
{
return "CarthaginianInfantryman";
}
}
public class CarthaginianArcher : Archer
{
public override string Info()
{
return "CarthaginianArcher";
}
}
public class CarthaginianHorseman : Horseman
{
public override string Info()
{
return "CarthaginianHorseman";
}
}
public abstract class ArmyFactory
{
public abstract Infantryman CreateInfantryman();
public abstract Archer CreateArcher();
public abstract Horseman CreateHorseman();
}
public class RomanArmyFactory : ArmyFactory
{
public override Infantryman CreateInfantryman()
{
return new RomanInfantryman();
}
public override Archer CreateArcher()
{
return new RomanArcher();
}
public override Horseman CreateHorseman()
{
return new RomanHorseman();
}
}
public class CarthaginianArmyFactory : ArmyFactory
{
public override Infantryman CreateInfantryman()
{
return new CarthaginianInfantryman();
}
public override Archer CreateArcher()
{
return new CarthaginianArcher();
}
public override Horseman CreateHorseman()
{
return new CarthaginianHorseman();
}
}
public class Army
{
private ArmyFactory _armyFactory;
private Warrior[] _army;
public Army(ArmyFactory parFactory)
{
_armyFactory = parFactory;
}
public Warrior[] CreateArmy()
{
_army = new Warrior[3];
_army[0] = _armyFactory.CreateInfantryman();
_army[1] = _armyFactory.CreateArcher();
_army[2] = _armyFactory.CreateHorseman();
return _army;
}
}
Для каждого типа войска создаётся своя иерархия классов, в которой выделяется отдельные классы для каждого типа войск по странам.
Создаётся базовый класс «ArmyFactory» для создания каждого из типов войск. Для армии каждой страны создаются фабрики – наследники.
Также добавляется класс «Army», который создаёт армию, используя переданную фабрику классов.
Создание армий двух стран выглядит следующим образом:
RomanArmyFactory romanArmyFactory = new RomanArmyFactory();
CarthaginianArmyFactory carthaginianArmyFactory = new CarthaginianArmyFactory();
Army romanArmy = new Army(romanArmyFactory);
Warrior[] romanWarriors = romanArmy.CreateArmy();
Army carthaginianArmy = new Army(carthaginianArmyFactory);
Warrior[] carthaginianWarriors = carthaginianArmy.CreateArmy();
Достарыңызбен бөлісу: |