设计模式案例 (三)

文章目录

系列文章目录

第一章 设计模式案例 (一)

第二章 设计模式案例 (二)

第三章 设计模式案例 (二)


文章目录


前言

上一篇文章介绍了常用的几种设计模式和常用场景,便于对设计模式加深理解,此文章主要讲解设计模式的案例。


一、单例模式

懒汉模式

case 包

代码如下(示例):

go 复制代码
package _case

type Config struct {
	name string
}

func (c *Config) GetName() string {
	return c.name
}
go 复制代码
package _case

var lazyConf *Config

// 懒汉式加载,单例模式,非线程安全
func GetLazyConfig() *Config {
	if lazyConf == nil {
		lazyConf = &Config{
			name: "lazy config",
		}
	}
	return lazyConf
}

代码如下(示例):main

go 复制代码
package main

import (
	_case "design-pattern/singleton/case"
	"fmt"
)

func main() {
	var conf *_case.Config
	conf = _case.GetLazyConfig()
	fmt.Println(conf.GetName())

	conf = _case.GetHungryConfig()
	fmt.Println(conf.GetName())

	conf = _case.GetCheckLockerConf()
	fmt.Println(conf.GetName())

	conf = _case.GetOnceConf()
	fmt.Println(conf.GetName())
}

饿汉模式

case 包

代码如下(示例):

go 复制代码
package _case

var hungryConf *Config

func init() {   //先初始化
	hungryConf = &Config{
		name: "hungry config",
	}
}

// 饿汉式 单例模式
func GetHungryConfig() *Config {
	return hungryConf
}

懒汉模式枷锁

case 包

代码如下(示例):简单工厂

go 复制代码
package _case

import "sync"

var checkLockerConf *Config
var checkLocker sync.Mutex

// 带检查锁的单例模式
func GetCheckLockerConf() *Config {
	if checkLockerConf == nil {
		checkLocker.Lock()
		defer checkLocker.Unlock()
		if checkLockerConf == nil {
			checkLockerConf = &Config{
				name: "check locker config",
			}
		}
	}
	return checkLockerConf
}
go 复制代码
package _case

import "sync"

var onceConf *Config
var once sync.Once

func GetOnceConf() *Config {
	once.Do(func() {
		onceConf = &Config{
			name: "once config",
		}
	})
	return onceConf
}
相关推荐
摇滚侠5 小时前
SpringBoot3+Vue3 全套视频教程 45-51
前端·javascript·vue.js
chouchuang5 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
触底反弹5 小时前
🔥 RAG 到底是怎么工作的?掰开揉碎了给你讲明白!
javascript·人工智能·后端
Hilaku5 小时前
前端大裁员背后的恐慌:我们还剩什么底牌?
前端·javascript·程序员
云空5 小时前
《Three.js 3D实例大全》
开发语言·javascript·3d·three.js
techdashen6 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
开发语言·后端·golang
C137的本贾尼6 小时前
第七篇:消息队列(MQ)——就是个带存储的异步通信管道
java·开发语言·中间件
云空6 小时前
《Three.js 3D坦克对战【AI单机版】》
javascript·人工智能·3d·three.js
默_笙6 小时前
🚲 手写一个"Claude Code":我用 LangChain + ReAct 循环,让 AI 自己读文件、解释代码
前端·javascript
等咸鱼的狸猫7 小时前
# JS 核心六大主题:闭包内存模型、原型链查找、事件流机制与 Promise / Event Loop 实现视角复盘
前端·javascript