系列文章目录
第一章 设计模式案例 (一)
第二章 设计模式案例 (二)
第三章 设计模式案例 (二)
前言
上一篇文章介绍了常用的几种设计模式和常用场景,便于对设计模式加深理解,此文章主要讲解设计模式的案例。
一、单例模式
懒汉模式
case 包
代码如下(示例):
package _case type Config struct { name string } func (c *Config) GetName() string { return c.name }
package _case var lazyConf *Config // 懒汉式加载,单例模式,非线程安全 func GetLazyConfig() *Config { if lazyConf == nil { lazyConf = &Config{ name: "lazy config", } } return lazyConf }
代码如下(示例):main
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 包
代码如下(示例):
package _case var hungryConf *Config func init() { //先初始化 hungryConf = &Config{ name: "hungry config", } } // 饿汉式 单例模式 func GetHungryConfig() *Config { return hungryConf }
懒汉模式枷锁
case 包
代码如下(示例):简单工厂
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 }
package _case import "sync" var onceConf *Config var once sync.Once func GetOnceConf() *Config { once.Do(func() { onceConf = &Config{ name: "once config", } }) return onceConf }