Абстрактные синглтоны, фабрики или 665 принцип ООП
- суббота, 12 июня 2021 г. в 00:55:59
В современном мире ООП стало неотъемлемой частью разработки. Многие популярные языки, такие как 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
. Данный способ проектирования славится своей гибкостью, и очень часто используется в продакшене.
Ну а чтобы закрепить материал, предлагаю вам самим написать пару абстрактных фабрик абстрактных синглтонов.