/* Абстрактная фабрика Предоставляет интерфейс для создания групп связанных или зависимых объектов, не указывая их конкретный класс */ 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(); } }