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