《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第二次并没有实现。


相关推荐
灯澜忆梦12 小时前
GO_文件处理---字符串操作
开发语言·golang
解局易否结局17 小时前
ArkUI MVI 架构实战:单向数据流设计模式在 HarmonyOS NEXT 中的深度实践
华为·设计模式·架构·harmonyos
Wzx19801219 小时前
RAG优化:17中RAG优化方案,那种才是最佳选择?
golang
解局易否结局20 小时前
ArkTS 设计模式与架构进阶:构建可维护的 HarmonyOS 应用
华为·设计模式·架构·harmonyos
李燚20 小时前
Graph 执行引擎源码:Eino 的节点调度是怎么工作的(第56篇-E42)
golang·ai编程·graph·agent框架·eino
happyness4420 小时前
AI编程与设计模式
设计模式·ai编程
就是小王同学啊20 小时前
Spring小技巧之设计模式
sql·spring·设计模式
wujf9020 小时前
Go 内存泄漏排查完整教程 (pprof)
开发语言·golang·xcode
Wang's Blog21 小时前
Go-Zero项目开发5: 数据库与缓存一致性问题及 go-zero 缓存机制解析
数据库·缓存·golang
布朗克16821 小时前
Go 入门到精通-18-文件操作
java·数据库·golang