Шаблон проектирования Singleton в Python

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

Вступление

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

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

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

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

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

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

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

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

Творческие шаблоны

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

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

Примеры шаблонов создания включают шаблоны Singleton, Factory Method, Abstract Factory, Builder и Prototype .

Шаблон Singleton

Определение

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

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

Мотивация

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

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

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

Выполнение

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

Все вызовы этого метода создания либо возвращают исходный одноэлементный объект, либо ошибку, сигнализирующую о существовании созданного объекта. Это предотвращает создание более одного объекта для нашего класса и поддерживает свойство 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() мы проверяем, доступен ли существующий экземпляр, и возвращаем его. Если нет, то создаем и возвращаем.

Наш SingletonGovt в действии:

 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 хранящийся в одной точке памяти. Любые попытки создать новое правительство пресекаются из-за исключения, которое мы поднимаем:

шаблон проектирования singleton в результатахPython{.ezlazyload}

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

Плюсы

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

Минусы

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

Заключение

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

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

comments powered by Disqus