Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров8.1K

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

Ну а чтобы закрепить материал, предлагаю вам самим написать пару абстрактных фабрик абстрактных синглтонов.

Теги:
Хабы:
Всего голосов 19: ↑7 и ↓12-4
Комментарии8

Публикации

Истории

Работа

Data Scientist
76 вакансий
Python разработчик
141 вакансия
Java разработчик
344 вакансии

Ближайшие события

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн