Абстрактные синглтоны, фабрики или 665 принцип ООП

от автора

В современном мире ООП стало неотъемлемой частью разработки. Многие популярные языки, такие как 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *