创建型-单例模式

Posted 程序员的进击之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建型-单例模式相关的知识,希望对你有一定的参考价值。

单例模式

介绍

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

file

单例模式,是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

几种常见模式

懒汉模式

懒汉模式是开源项目中使用最多的一种,最大的缺点是非线程安全的

type singleton struct {
}

// private
var instance *singleton

// public
func GetInstance() *singleton {
    if instance == nil {
        instance = &singleton{}     // not thread safe
    }
    return instance
}

带锁的单例模式

这里使用了Go的sync.Mutex,其工作模型类似于Linux内核的futex对象,具体实现极其简单,性能也有保证 初始化时填入的0值将mutex设定在未锁定状态,同时保证时间开销最小 这一特性允许将mutex作为其它对象的子对象使用

type singleton struct {
}

var instance *singleton
var mu sync.Mutex

func GetInstance() *singleton {
    mu.Lock()
    defer mu.Unlock()

    if instance == nil {
        instance = &singleton{}     // unnecessary locking if instance already created
    }
    return instance
}

代码示例

// 单例模式
// 使用懒惰模式的单例模式,使用双重检查加锁保证线程安全
package main

import (
 "log"
 "sync"
)

//Singleton 是单例模式类
type Singleton struct {
}

var instance *Singleton
var once sync.Once

func GetInstance() *Singleton {
 once.Do(func() {
  instance = &Singleton{}
 })
 return instance
}

func main() {
 ins1 := GetInstance()
 ins2 := GetInstance()
 if ins1 != ins2 {
  log.Fatalf("instance is not equal")
 }
}



以上是关于创建型-单例模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 - 创建型模式_7种单例模式实现

设计模式 - 创建型模式_7种单例模式实现

创建型模式之单例模式

设计模式创建型-单例模式

Java设计模式——创建型模式之单例模式

[设计模式C++go]创建型模式:单例模式