«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Шаблоны проектирования Go #Singleton

Шаблоны проектирования Go #Singleton

Опубликовано 8 ноября 2024 г.
Просматривать:768

Go Design Patterns #Singleton

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

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

Чтобы начать эту серию, давайте поговорим о шаблоне 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 гарантирует, что будет создан только один экземпляр синглтона, даже если он вызывается несколько раз.

  • Сначала он проверяет, равен ли экземпляр нулю (т. е. ни один экземпляр еще не создан).
  • Если экземпляр равен нулю, он блокирует раздел кода с помощью lock.Lock(), чтобы предотвратить одновременный вход в этот раздел нескольких горутин.
  • После блокировки выполняется вторая проверка, чтобы убедиться, что никакая другая горутина не создала экземпляр между первой проверкой и моментом получения блокировки.
  • Если экземпляр по-прежнему равен нулю, создается новый одноэлементный экземпляр, который присваивается глобальной переменной.
  • Синхронизация.Mutex и блокировка с двойной проверкой гарантируют, что создание одноэлементного экземпляра является потокобезопасным, предотвращая создание отдельных экземпляров несколькими горутинами.
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/eduardoarndt/go-design-patterns-1-singleton-4ap9?1. В случае нарушения авторских прав свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3