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


Пример реализации абстрактной фабрики



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

Пример реализации абстрактной фабрики


Рассмотрим пример реализации абстрактной фабрики для создания различных типов воинов. Сделаем классы создания армий двух разных стран: Рим и Карфаген. Для простоты, будем считать, что у каждой страны есть одинаковые типы воинов.
Диаграмма классов выглядит следующим образом:

Рисунок 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();


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




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

    Басты бет