Рубрики
Без рубрики

Шаблон одноэлементного проектирования в Python

Синглтон-это общий шаблон создания, используемый для определения создания одного экземпляра и точки доступа к объекту. В этой статье мы погрузимся в одноэлементный шаблон проектирования, реализованный в Python.

Автор оригинала: Robley Gori.

Вступление

В этой статье мы погрузимся в шаблон Singleton Design Pattern , реализованный в Python.

Со временем программное обеспечение становится все более приспособленным к решению конкретных задач в различных областях. Хотя существует много различий в прикладном уровне нашего программного обеспечения, некоторые аспекты разработки программного обеспечения остаются в основном теми же. Эти аспекты могут не оставаться одинаковыми для всех существующих программ, но будут справедливы для многих сценариев. Поэтому изучение и понимание их будет очень полезно для создания устойчивых программ.

Это первая из серии о шаблонах проектирования в Python и различных шаблонах, которые мы можем использовать для создания программного обеспечения.

Что такое шаблон дизайна?

Шаблон проектирования-это особый подход к решению повторяющейся проблемы в разработке программного обеспечения, а также используется для представления передовой практики. Это не фактический код, но он представляет собой особый способ организации кода для получения желаемого решения рекомендуемым способом. Это означает, что мы не должны строго следовать установленным шаблонам проектирования для всего нашего кода, но анализировать ваши потребности и применять наиболее подходящий шаблон проектирования для наших нужд.

Шаблоны проектирования возникают из богатого опыта решения проблем в разработке программного обеспечения и проверяются на соответствие конкретным сценариям. Еще одна причина узнать о шаблонах проектирования заключается в том, что, хотя шаблон может не работать для конкретного сценария, он может предложить основу, на которой может быть сформулировано решение.

Однако, поскольку шаблоны проектирования могут помочь нам выйти из различных ситуаций, важно оценить текущую ситуацию и изучить все доступные варианты, прежде чем переходить непосредственно к шаблону, потому что там может быть лучшее решение.

Паттерны проектирования делятся на несколько широких категорий, хотя в основном Креативные паттерны, Структурные паттерны и поведенческие паттерны|/.

Творческие Паттерны

Существует несколько аспектов шаблонов проектирования, которые отличают их друг от друга, включая сложность шаблона проектирования, уровень приложения в системе и количество деталей.

Шаблоны создания включают в себя те, которые определяют способы создания объектов, способствующих повышению гибкости и возможности повторного использования кода во всем приложении.

Примеры креативных паттернов включают Синглтонный паттерн, Фабричный метод, Абстрактную фабрику, Конструктор и Прототип паттерны.

Синглтонный паттерн

Определение

Одноэлементный шаблон-это общий шаблон создания, который используется для определения создания одного экземпляра класса и предоставления единой глобальной точки доступа к этому объекту.

Этот шаблон ограничивает количество объектов, которые могут быть созданы из класса, одним единственным объектом, который часто будет совместно использоваться глобально в приложении.

Мотивация

Этот шаблон обычно реализуется в функциях, требующих контроля доступа к общему ресурсу, такому как соединение с базой данных или файл. Гарантируя, что класс может использоваться только для создания одного экземпляра и предоставления одной глобальной точки доступа, доступ к общему ресурсу может быть ограничен и целостность может быть сохранена.

Создание отдельных экземпляров также помогает гарантировать, что некоторые аспекты наших программ не могут быть перезаписаны другими классами, что приводит к небезопасному или неэффективному коду. Это также позволяет нам получить доступ к одному и тому же объекту в нескольких точках наших программ, не опасаясь, что он может быть перезаписан в какой-то момент нашей программы.

Например, соединения с базой данных выполняются один раз в наших программах, и один и тот же объект используется для выполнения операций с нашей базой данных по всему приложению. Если различные части нашего приложения могут создавать свои собственные соединения с базой данных, со временем могут возникнуть проблемы с целостностью, поскольку каждая часть пытается получить доступ к базе данных самостоятельно.

Реализация

Одноэлементный шаблон требует, чтобы создание экземпляра класса было ограничено только одним объектом. Управление созданием объекта достигается путем реализации метода создания, который сохраняет созданный объект в поле static .

Все вызовы этого метода создания либо возвращают исходный одноэлементный объект, либо ошибку, сигнализирующую о существовании экземпляра объекта. Это предотвращает создание более одного объекта для нашего класса и поддерживает свойство singleton.

Хорошая аналогия синглетной модели заключается в том, что страна может иметь одно правительство, которое контролирует доступ и операции внутри страны. Любые попытки создать другое правительство запрещены.

Мы можем реализовать эту правительственную аналогию в одноэлементном классе следующим образом в Python:

class SingletonGovt:
   __instance__ = None

   def __init__(self):
       """ Constructor.
       """
       if SingletonGovt.__instance__ is None:
           SingletonGovt.__instance__ = self
       else:
           raise Exception("You cannot create another SingletonGovt class")

   @staticmethod
   def get_instance():
       """ Static method to fetch the current instance.
       """
       if not SingletonGovt.__instance__:
           SingletonGovt()
       return SingletonGovt.__instance__

В нашем примере мы определяем переменную, которая будет содержать единственный объект для создания экземпляра. Наш конструктор проверяет наличие существующего класса и выдает ошибку.

При извлечении объекта с помощью метода get_instance() мы проверяем, доступен ли существующий экземпляр, и возвращаем его. Если нет, мы создаем его и возвращаем.

Наше Синглтонское правительство в действии:

government = SingletonGovt()
print(government)

same_government = SingletonGovt.get_instance()
print(same_government)

another_government = SingletonGovt.get_instance()
print(another_government)

new_government = SingletonGovt()
print(new_government)

Когда мы запускаем наш скрипт, мы видим, что у нас есть только один экземпляр SingletonGovt , хранящийся в одной точке памяти. Любые попытки создать другое правительство пресекаются исключением, которое мы поднимаем:

синглтонный шаблон проектирования в результатах python

плюсы и минусы

Плюсы

  • Одноэлементный паттерн гарантирует, что существует только один экземпляр нашего класса, и снижает риск неожиданного поведения в нашей программе.
  • Поскольку создание класса контролируется одним классом, это обеспечивает гибкость, поскольку изменения должны быть внесены только в один класс и объект.

Аферы

  • Класс, созданный с использованием одноэлементного шаблона, нарушает принцип Single Responsibility Principle , поскольку класс может обрабатывать более одной ответственности в данный момент времени.
  • Управление жизненным циклом может создавать проблемы в других областях, таких как тестирование, поскольку одноэлементный класс сохраняется в течение всего срока службы приложения, а различные тестовые случаи могут потребовать новых версий класса.

Вывод

В этом посте мы представили, обсудили и реализовали шаблон одноэлементного проектирования.

Как и любой другой шаблон дизайна, он имеет свои плюсы и минусы, и хотя он может быть пригоден для некоторых ситуаций, он может не относиться ко всем нашим потребностям в разработке. Поэтому мы должны проанализировать проблему и принять решение о том, облегчит ли синглтонный паттерн нашу работу.