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


相关推荐
青禾网络2 天前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式
ZJPRENO3 天前
吃透软件开发六大设计原则,告别烂代码
设计模式
咖啡八杯3 天前
GoF设计模式——命令模式
java·设计模式·架构
花椒技术3 天前
HJPusher / HJPlayer SDK 实践:我们为什么把直播推播链路拆成一套可复用能力
设计模式·harmonyos·直播
艺艺生辉4 天前
迭代器模式-"我也想被增强for循环"
设计模式
咖啡八杯5 天前
GoF设计模式——策略模式
java·后端·spring·设计模式
槑有老呆7 天前
别再手搓 Prompt 了,那个叫"手动挡循环"
设计模式
用户6919026813398 天前
Vibe Coding 开发项目的基本范式
人工智能·设计模式·代码规范
怕浪猫8 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构