Шаблоны проектирования — это проверенные решения распространенных проблем, возникающих при проектировании программного обеспечения. Они предоставляют шаблон или руководство для решения этих проблем гибким и многоразовым способом.
Каждый шаблон представляет собой передовой опыт, который разработчики могут адаптировать к своему конкретному контексту. Шаблоны проектирования часто делятся на три основные категории.
Чтобы начать эту серию, давайте поговорим о шаблоне Singleton.
Шаблон Singleton гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
Это полезно в тех случаях, когда вам необходимо управлять общим ресурсом, например подключениями к базе данных или настройками конфигурации.
Часто необходимо убедиться, что существует только один экземпляр класса, например, при управлении конфигурациями или взаимодействии с аппаратными ресурсами. Без Singleton создание нескольких экземпляров может привести к таким проблемам, как противоречивые данные или блокировки ресурсов.
Это очень часто случается при работе с асинхронным кодом, когда несколько горутин могут создавать новые экземпляры класса или получать доступ к общим ресурсам.
Рассмотрите пул соединений с базой данных: если несколько частей вашего приложения одновременно создают новые соединения, вы можете столкнуться с избыточными или конфликтующими взаимодействиями с базой данных. Синглтон гарантирует, что в приложении будет создано и использовано только одно соединение.
package main import ( "fmt" "sync" ) type Singleton interface { DoSomething() string } type singleton struct{} var lock = &sync.Mutex{} var instance *singleton func NewSingletonInstance() *singleton { if instance == nil { lock.Lock() defer lock.Unlock() if instance == nil { fmt.Println("Creating single instance now.") instance = &singleton{} } else { fmt.Println("Single instance already created.") } } else { fmt.Println("Single instance already created.") } return instance } func (s *singleton) DoSomething() string { return "Doing something." } func main() { instance1 := NewSingletonInstance() instance2 := NewSingletonInstance() fmt.Printf("%p\n", instance1) fmt.Printf("%p\n", instance2) }
Функция NewSingletonInstance гарантирует, что будет создан только один экземпляр синглтона, даже если он вызывается несколько раз.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3