设计模式案例 (三)

文章目录

系列文章目录

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

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

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


文章目录


前言

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


一、单例模式

懒汉模式

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
}
相关推荐
志尊宝19 小时前
Vue3 零基础每日笔记(027):组件上的 v-model——让自定义组件也能双向绑定
前端·javascript·vue.js·笔记·html5
云浪19 小时前
从 0 手写一个 MCP Server:让 Copilot 调用 Tool 完成四则运算
javascript·node.js·mcp
小此方21 小时前
「C++AI大模型接入SDK」(一) API接入与本地两种方式对比、API Key获取、API报文详解与简单API的构建
开发语言·c++·人工智能
wuyk5551 天前
Python实战项目02:学生成绩管理系统(控制台|CSV导出|完整落地)
开发语言·python
浪子明X1 天前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
尾善爱看海1 天前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
xiangyun611 天前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun611 天前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
白远山1 天前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
DevRay1 天前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言