我是靠谱客的博主 含糊柠檬,最近开发中收集的这篇文章主要介绍创建型之单例模式创建型单例模式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 创建型
  • 单例模式
    • 1. 饿汉式
    • 2. 懒汉式
    • 3. 双重检查
    • 4. sync.Once

创建型

创建型设计模式包括:单例模式、工厂模式、建造者模式、原型模式它主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。

单例模式

单例模式用来创建全局唯一的对象。一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例模式。
在这里插入图片描述

1. 饿汉式

直接将实例初始化写在init()方法中,从而在加载包的时候便完成了初始化,且只会初始化一次。

package singleton

// Singleton 饿汉式单例
type Singleton struct{}

var singleton *Singleton

func init() {
	singleton = &Singleton{}
}

// GetInstance 获取实例
func GetInstance() *Singleton {
	return singleton
}

2. 懒汉式

通过加锁实现只被初始化一次

package singleton

import (
	"sync"
)

// Singleton 
type Singleton struct{}

var (
	singleton *Singleton
	mu		sync.Mutex
)

// GetInstance 获取实例
func GetInstance() *Singleton {
	mu.Lock()
	defer mu.Unlock()
	if singleton != nil {
		singleton = &Singleton{}
	}
	return singleton
}

3. 双重检查

上面懒汉式加载用到了锁,但是锁的粒度有点大,每次来获取对象的时候,都会在GetInstance方法中加锁,影响性能,所以可以使用双重检查的机制

package singleton

import (
	"sync"
)

// Singleton 
type Singleton struct{}

var (
	singleton *Singleton
	mu		sync.Mutex
)

// GetInstance 获取实例
func GetInstance() *Singleton {
	if singleton != nil { // 1
		mu.Lock()
		defer mu.Unlock()
		if singleton != nil { // 2
			singleton = &Singleton{}
		}
	}	
	return singleton
}

1处判断实例不为空的时候,可以直接返回实例了,但如果实例是空的,说明还没有被初始化。在并发情况下,可能有多个协程进入了1,所以在2之前,先加锁,只让一个协程进入2,完成实例初始化,后面进入1的协程来到2时,发现实例已经被其他协程初始化过了,可以直接返回实例了。

4. sync.Once

go语言中是sync.Once可以很轻松的保证实例只被初始化一次

package singleTon

import (
	"sync"
)

type SingleTon struct {}

var (
	once     sync.Once
	instance *SingleTon
)

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

最后

以上就是含糊柠檬为你收集整理的创建型之单例模式创建型单例模式的全部内容,希望文章能够帮你解决创建型之单例模式创建型单例模式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部