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


相关推荐
华仔啊3 小时前
别学23种了!Java项目中最常用的6个设计模式,附案例
java·后端·设计模式
xy_recording4 小时前
Day08 Go语言学习
开发语言·学习·golang
吧唧霸4 小时前
golang读写锁和互斥锁的区别
开发语言·算法·golang
Keya6 小时前
MacOS端口被占用的解决方法
前端·后端·设计模式
已读不回1437 小时前
设计模式-单例模式
前端·设计模式
long3161 天前
构建者设计模式 Builder
java·后端·学习·设计模式
一乐小哥1 天前
从 JDK 到 Spring,单例模式在源码中的实战用法
后端·设计模式
付春员1 天前
23种设计模式
设计模式
七七&5562 天前
2024年08月13日 Go生态洞察:Go 1.23 发布与全面深度解读
开发语言·网络·golang