设计模式案例 (三)

文章目录

系列文章目录

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

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

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


文章目录


前言

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


一、单例模式

懒汉模式

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
}
相关推荐
Goodbye20 分钟前
从 Token 到 Embedding:LLM 核心基础深度解析
javascript·人工智能
用户9385156350726 分钟前
工具调用背后:LLM 如何突破“缸中大脑”,操控真实世界?
javascript·人工智能
Goodbye26 分钟前
从函数到智能:LLM Tool Use 深度解析
javascript·人工智能
半个落月27 分钟前
大模型到底是怎么“调用工具”的?从一个 Node.js Demo 看懂 Tool Use
javascript·人工智能
烬羽35 分钟前
中英文 token 数量差一倍?两段 JS 代码搞懂 LLM 底层是怎么"读"文字的
javascript·程序员·架构
山河木马42 分钟前
矩阵专题1-怎么创建模型矩阵(uModelMatrix)
javascript·webgl·计算机图形学
花椒技术1 小时前
HJPusher / HJPlayer SDK 实践:我们为什么把直播推播链路拆成一套可复用能力
设计模式·harmonyos·直播
前端开发爱好者5 小时前
支持 110 种文件预览!兼容 Vue、React、Svelte!
前端·javascript·vue.js
大家的林语冰7 小时前
👍 尤大重学 Webpack,Vite 8.1 再进化,打包模式复活!
前端·javascript·vite
张元清7 小时前
React useIsomorphicLayoutEffect:修掉 SSR 下的 useLayoutEffect 警告(2026)
前端·javascript·面试