Golang设计模式——19单例模式

单例模式

定义

单例模式是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。

该模式有三个基本要点:

一是这个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。

优点

  1. 节省多次加载的内存消耗

缺点

  1. 线程安全问题需要仔细考虑

场景

系统中某个类用来加载配置文件,如果每次加载都创建一个实例,是不是就会造成资源浪费呢?这时候使用单例模式就可以节省多次加载的内存消耗。

不同单例模式

  1. 饿汉式单例模式:被加载时就将自己实例化(文本代码就是如此)
  2. 懒汉式单例模式:第一次被引用时,才会将自己实例化

代码

package Singleton

import "sync"

var (
	p    *Pet
	once sync.Once
)

func init() {
	once.Do(func() {
		p = &Pet{}
	})
}

func GetInstance() *Pet {
	return p
}

type Pet struct {
	name string
	age  int
	mux  sync.Mutex
}

func (p *Pet) SetName(n string) {
	p.mux.Lock()
	defer p.mux.Unlock()
	p.name = n
}
func (p *Pet) GetName() string {
	p.mux.Lock()
	defer p.mux.Unlock()
	return p.name
}
func (p *Pet) IncrementAge() {
	p.mux.Lock()
	defer p.mux.Unlock()
	p.age++
}
func (p *Pet) GetAge() int {
	p.mux.Lock()
	defer p.mux.Unlock()
	return p.age
}

func TestGetInstance(t *testing.T) {
	p1:=GetInstance()
	p2:=GetInstance()
	if p1==p2 {
		fmt.Println("单例")
	}
}

其他设计模式

设计模式Git源代码
00简单工厂模式
01工厂方法模式
02抽象工厂模式
03外观模式
04建造者模式
05桥接模式
06命令模式
07迭代器模式
08模板模式
09访问者模式
10备忘录模式
11责任链模式
12中介模式
13原型模式
14状态模式
15策略模式
16享元模式
17组合模式
18解释器模式
19单例模式
20适配器模式
21代理模式
22装饰器模式
23观察者模式

posted @ 2021-09-25 17:49  cheems~  阅读(55)  评论(0编辑  收藏  举报