В современном мире ООП стало неотъемлемой частью разработки. Многие популярные языки, такие как Pyhon, Jaba, Hashkell, GOO и C== поддерживают данную парадигму. В этой статье я постараюсь раскрыть смысл таких архитектурных конструкций, как абстрактный синглтон и фабрика абстрактных синглтонов.
Кому это нужно?
Эта статья будет полезна как для разработчиков сайтов, так и для опытных системных программистов. Данный принцип, как и все предыдущие 665, помогает прийти к пониманию Очень Ориентированного Программирования. Этот подход помогает правильно структурировать код, повысить его читабельность и ускорить понимание логики программы.
Синглтон
Прежде чем перейти на более абстрактный уровень, для начала нужно разобраться, что такое синглтон. Синглтон (хинди. अच्छा कोड ) — порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр некоторого класса, и предоставляющий глобальную точку доступа к этому экземпляру. Паттерн синглтон — один из самых известных паттернов. Реализация его очень проста, и сейчас мы рассмотрим один из примеров синглтона на каноничном ООП языке Jaba:
singleton Calculator { int AddTheFirstIntegerNumberToTheSecondIntegerNumber(int firstNumber, int secondNumber) { return System.Calculator.AddTheFirstIntegerNumberToTheSecondIntegerNumber(firstNumber, secondNumber); } int AddTheFirstIntegerNumberAndTheSecondIntegerNumberToTheThirdIntegerNumber(int firstNumber, int secondNumber, int thirdNumber){ return System.Calculator.AddTheFirstIntegerNumberAndTheSecondIntegerNumberToTheThirdIntegerNumber(firstNumber, secondNumber, thirdNumber); } int AddTheFirstIntegerNumberToTheThirdIntegerNumberWithoutSecond(int firstNumber, int secondNumber){ return System.Calculator.AddTheFirstIntegerNumberToTheThirdIntegerNumberWithoutSecond(firstNumber, secondNumber); } }
Абстрактный синглтон
Как вы уже заметили, паттерн синглтон достаточно негибок и не может предоставить нужного нам функционала. И тут на помощь приходит абстрактный синглтон! Что же такое абстрактный синглтон? Абстрактный Синглтон (хинди. वही कोड, लेकिन इससे भी बेहतर) — абстрактный порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр некоторого объекта, и предоставляющий точку доступа к этому экземпляру.
Чем же абстрактный синглтон отличается от синглтона?
Главное отличие абстрактного синглтона от обыконвенного в том, что абстрактный синглтон является множеством различных синглтонов. Для того, чтобы обеспечить лучшее понимание, подкреплю это высказывание кодом:
abstract singleton AbstractCalculator { int Add(a, b){ return a + b; } int Sub(a, b){ return a - b; } }
И вот, код написан. Но есть ньюанс: если мы попытаемся использовать его через AbstractCalculator.AbstractAdd(1, 2), то получим ошибку компиляции. Причина этого кроется в том, что для того, чтобы использовать абстрактный аинглтон, нужно сначала его конкретизировать:
calculator = AbstractCalculator()
Иногда возникает необходимость конкретизировать абстрактный синглтон несколько раз под разными именами:
calculator1 = AbstractCalculator() calculator2 = AbstractCalculator() calculator3 = AbstractCalculator() calculator1.Add(1, 2) # 3.000000000001
Фабрика абстрактных синглтонов
Конкретизировать абстрактные синглтоны вручную долго и очень неудобно. Однако, эту проблему решает ещё один паттерн: Фабрика синглтонов. Создать фабрику очень просто: нужно просто создать синглтон, который будет создавать синглтоны:
singleton AbstractCalculatorFactory { AbstractCalculator CreateAbstractCalculator() { return AbstractCalculator(); } }
Использование:
calculator1 = AbstractCalculatorFactory.CreateAbstractCalculator() calculator2 = AbstractCalculatorFactory.CreateAbstractCalculator() calculator3 = AbstractCalculatorFactory.CreateAbstractCalculator() calculator1.Add(1, 2) # 3.000000000001
Абстрактная фабрика абстрактных синглтонов
Если фабрика абстрактных синглтонов является абстрактным синглтоном, то почему бы её не абстрагировать, сделав тем самым наш код более элегантным?
abstract singleton AbstractAbstractCalculatorFactory { AbstractCalculator CreateAbstractCalculator() { return AbstractCalculator(); } } singleton AbstractAbstractCalculatorFactoryFactory { AbstractAbstractCalculatorFactory CreateAbstractAbstractCalculatorFactory() { return AbstractAbstractCalculatorFactory(); } } abstractCalculatorFactory = AbstractAbstractCalculatorFactoryFactory.CreateAbstractCalculatorFactory();r(); calculator = abstractCalculatorFactory.CreateAbstractCalculator(); calculator.Add(1, 2) # 3.0000000000001
Как видите, код получился очень гибким, а главное — переиспользуемым! Мы можем создавать столько фабрик абстрактных калькуляторов и калькуляторов, сколько мы хотим! Сотня? Не проблема! Тысяча? Раз плюнуть! Миллион? Да почему бы и нет?
Приведённые выше шаблоны проектирования можно комбинировать и использовать столько, сколько душе угодно, порождая такие прелести, какAbstractAbstractAbstractAbstractAbstractCalculatorFactoryFactoryFactoryFactoryFactory. Данный способ проектирования славится своей гибкостью, и очень часто используется в продакшене.
Ну а чтобы закрепить материал, предлагаю вам самим написать пару абстрактных фабрик абстрактных синглтонов.
ссылка на оригинал статьи https://habr.com/ru/post/562094/
Добавить комментарий