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


相关推荐
CPUOS20102 小时前
嵌入式C语言高级编程之MVC设计模式
c语言·设计模式·mvc
张涛酱1074568 小时前
Subagent Orchestration 深入解析:多Agent协作的层级架构
spring·设计模式·ai编程
星辰_mya10 小时前
PV之系统与并发的核心wu器
java·开发语言·后端·学习·面试·架构师
小江的记录本11 小时前
【系统设计】《2026高频经典系统设计题》(秒杀系统、短链接系统、订单系统、支付系统、IM系统、RAG系统设计)(完整版)
java·后端·python·安全·设计模式·架构·系统架构
北漂Zachary11 小时前
四大编程语言终极对决:汇编/C#/Go/Java谁更强
汇编·golang·c#
Stark-C12 小时前
NAS音乐必备神器,全平台音乐收割机!极空间部署『Go Music DL』
开发语言·后端·golang
楼田莉子13 小时前
同步/异步日志系统:日志器管理器模块\全局接口\性能测试
linux·服务器·开发语言·c++·后端·设计模式
Meya112715 小时前
U位资产管理系统:数据中心“最后一公里“的精细化治理
设计模式·开源·交互
ALex_zry17 小时前
go-zero Redis缓存封装与Model层设计
redis·缓存·golang·气象
回忆2012初秋1 天前
工厂方法模式完整实现:GPS转换
设计模式·工厂方法模式