Перейти к содержанию

AbstractFactory.cs

Код подключён напрямую из исходного файла в кодировке UTF-8, поэтому эта страница всегда показывает его актуальную версию.

← К конспекту Скачать исходный файл

AbstractFactory.cs
using System;

namespace DesignPatterns.Creational.AbstractFactory
{
    // Семейство продуктов №1
    public interface IButton
    {
        void Render();
    }

    // Семейство продуктов №2
    public interface ICheckbox
    {
        void Render();
    }

    // Конкретные продукты для темы "Light"
    public sealed class LightButton : IButton
    {
        public void Render() => Console.WriteLine("Светлая кнопка");
    }

    public sealed class LightCheckbox : ICheckbox
    {
        public void Render() => Console.WriteLine("Светлый чекбокс");
    }

    // Конкретные продукты для темы "Dark"
    public sealed class DarkButton : IButton
    {
        public void Render() => Console.WriteLine("Тёмная кнопка");
    }

    public sealed class DarkCheckbox : ICheckbox
    {
        public void Render() => Console.WriteLine("Тёмный чекбокс");
    }

    // Абстрактная фабрика - гарантирует, что кнопка и чекбокс будут из одной темы
    public interface IUiFactory
    {
        IButton CreateButton();
        ICheckbox CreateCheckbox();
    }

    public sealed class LightUiFactory : IUiFactory
    {
        public IButton CreateButton() => new LightButton();
        public ICheckbox CreateCheckbox() => new LightCheckbox();
    }

    public sealed class DarkUiFactory : IUiFactory
    {
        public IButton CreateButton() => new DarkButton();
        public ICheckbox CreateCheckbox() => new DarkCheckbox();
    }

    // Клиентский код работает только с абстракциями и никогда не смешивает
    // компоненты из разных семейств (например, светлую кнопку с тёмным чекбоксом).
    public sealed class SettingsDialog
    {
        private readonly IButton _button;
        private readonly ICheckbox _checkbox;

        public SettingsDialog(IUiFactory factory)
        {
            _button = factory.CreateButton();
            _checkbox = factory.CreateCheckbox();
        }

        public void Render()
        {
            _button.Render();
            _checkbox.Render();
        }
    }

    public static class Demo
    {
        public static void Run()
        {
            IUiFactory factory = DateTime.Now.Hour < 18
                ? new LightUiFactory()
                : new DarkUiFactory();

            var dialog = new SettingsDialog(factory);
            dialog.Render();
        }
    }
}