文章目录
系列文章目录
第一章 设计模式案例 (一)
第二章 设计模式案例 (二)
第三章 设计模式案例 (二)
文章目录
前言
上一篇文章介绍了常用的几种设计模式和常用场景,便于对设计模式加深理解,此文章主要讲解设计模式的案例。
一、单例模式
懒汉模式
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
}