《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)

文章目录

  • [1. 概述](#1. 概述)
    • [1.1 目的](#1.1 目的)
    • [1.2 实现方式](#1.2 实现方式)
  • [2. 代码示例](#2. 代码示例)
    • [2.1 设计](#2.1 设计)
    • [2.2 代码](#2.2 代码)

1. 概述

1.1 目的

  • 保证类只有一个实例
  • 有方法能让外部访问到该实例

1.2 实现方式

  • 懒汉式

    在第一次调用单例对象时创建该对象,这样可以避免不必要的资源浪费

  • 饿汉式

    在程序启动时就创建单例对象,这样可以提高程序的运行效率

  • 双重检查锁

    通过加锁来保证同一时刻只有一个线程可以创建单例对象

2. 代码示例

2.1 设计

以一个饿汉式模式为例

  • 定义一个单例对象king
    • 它的Get()方法为外部提供访问
  • 声明一个变量ourKing,它的类型是单例对象king
  • 定义一个函数CreateKing()用来实例化ourKing
  • 定义初始化函数,调用函数CreateKing() 实例化ourKing
  • 调用
    • 使用ourKingGet()方法访问单例对象
    • 再次调用CreateKing() 实例化ourKing,并访问单例对象
      • 结果没有变化,说明第二次实例化没有执行

如果使用懒汉式模式,在main()函数调用CreateKing()函数即可

2.2 代码

  • han包
go 复制代码
package main

import (
	"fmt"
	"sync"
)

// 定义单例对象
type king struct {
	Name string
}

// 提供一个方法访问单例对象
func (k *king) Get() {
	fmt.Printf("%s is king\n", k.Name)
}

var (
	//保证后边创建函数只能执行一次
	once sync.Once
	//声明单一个变量类型是单例对象
	ourKing *king
)

func init() {
	//懒汉模式,启动时创建一个实例
	CreateKing("汉献帝")
}

// 定义一个创建单例对象的函数
func CreateKing(name string) (k *king) {
	once.Do(func() {
		ourKing = &king{
			Name: name,
		}
	})
	return ourKing
}
func main() {
	//查看该启动时实例化的单例
	ourKing.Get()
	//再次实例化,并且访问它,结果我们可以看见,没有创建新实例
	CreateKing("曹贼").Get()
}
  • 输出
shell 复制代码
献帝 is king
献帝 is king

可见SetKing第二次并没有实现。


相关推荐
Chrikk2 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*2 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue2 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man2 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
WaaTong4 小时前
《重学Java设计模式》之 单例模式
java·单例模式·设计模式
WaaTong6 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
霁月风6 小时前
设计模式——观察者模式
c++·观察者模式·设计模式
有梦想的咸鱼_6 小时前
go实现并发安全hashtable 拉链法
开发语言·golang·哈希算法
暗黑起源喵8 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
杜杜的man10 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang