设计模式之单例模式

miloyang
0 评论
/ /
468 阅读
/
1820 字
23 2023-11

简介

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于控制对唯一实例的访问,以便在系统中的多个部分之间共享该实例。

jugelizi

比如你去买车,竞拍车,每次出价1块钱,200个人同时出价,但车只有一辆。

Demo

// Singleton 单例类
type Singleton struct {
    car   string
    price int
    mux   sync.Mutex // 防止竞争,上锁
}

var instance *Singleton
var once sync.Once

// GetInstance 获取单例实例
func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}

func (s *Singleton) SetCar(name string) {
    s.mux.Lock()
    defer s.mux.Unlock()
    s.car = name
}

func (s *Singleton) SetPrice() {
    s.mux.Lock()
    defer s.mux.Unlock()
    s.price += 10000
}

func (s *Singleton) Message() (string, int) {
    s.mux.Lock()
    defer s.mux.Unlock()
    return s.car, s.price
}

test

func TestSingleton(t *testing.T) {
    var wg sync.WaitGroup
    wg.Add(200)

    for i := 0; i < 200; i++ {
        go func() {
            instance := GetInstance()
            instance.SetCar("BWM")
            instance.SetPrice()
            wg.Done()
        }()
    }

    wg.Wait()
    instance1 := GetInstance()
    fmt.Println(instance1.Message()) // BWM 200
}

作用和场景

  • 全局唯一实例

    当系统中需要一个全局唯一的实例来协调不同部分的工作时,可以使用单例模式。

  • 资源共享

    单例模式可以确保多个对象共享同一个实例,以便共享资源、数据或状态。

  • 节省资源

    在某些情况下,创建实例的代价较高,而且只需要一个实例时,单例模式可以节省资源。

  • 全局访问点

    单例模式提供了一个全局的访问点,使得系统中的不同部分可以方便地访问同一个实例。

  • 控制实例数量

    控制实例的数量,确保系统中只有一个实例存在。

总体而言,单例模式适用于需要一个全局唯一实例、共享资源或控制实例数量的场景。然而,在使用单例模式时需要注意不要过度使用,避免引入全局状态和依赖关系。

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步