/* Абстрактная фабрика
Предоставляет интерфейс для создания
групп связанных или зависимых объектов,
не указывая их конкретный класс
*/
class Program
{
static void Main()
{
#region Пример №1 - базовое
var soldier = new Hero(new SoldierFactory());
soldier.Run();
soldier.Hit();
var elf = new Hero(new ElfFactory());
elf.Run();
elf.Hit();
Console.ReadKey();
#endregion
}
}
///
/// Оружие базовая логика
///
abstract class Weapon
{
public abstract void Hit();
}
///
/// Движение базовая логика
///
abstract class Movement
{
public abstract void Move();
}
///
/// Огнестрел
///
class Gun : Weapon
{
public override void Hit()
{
Console.WriteLine("Hit Gun");
}
}
///
/// Арбалет
///
class Arbalet : Weapon
{
public override void Hit()
{
Console.WriteLine("Hit Arbalet");
}
}
///
/// Герой летает
///
class Fly : Movement
{
public override void Move()
{
Console.WriteLine("Hero Fly");
}
}
///
/// Герой бежит
///
class Run : Movement
{
public override void Move()
{
Console.WriteLine("Hero Run");
}
}
///
/// Супергерой
///
class Hero
{
private Weapon Weapon { get; set; }
private Movement Movement { get; set; }
public Hero(HeroFactory factory)
{
Weapon = factory.CreateWeapon();
Movement = factory.CreateMovement();
}
public void Run()
{
Movement.Move();
}
public void Hit()
{
Weapon.Hit();
}
}
///
/// Абстракция фабрика героев
///
abstract class HeroFactory
{
public abstract Weapon CreateWeapon();
public abstract Movement CreateMovement();
}
///
/// Эльфы
///
class ElfFactory : HeroFactory
{
public override Movement CreateMovement()
{
return new Fly();
}
public override Weapon CreateWeapon()
{
return new Arbalet();
}
}
///
/// Солдаты
///
class SoldierFactory : HeroFactory
{
public override Movement CreateMovement()
{
return new Run();
}
public override Weapon CreateWeapon()
{
return new Gun();
}
}