Golang设计模式——19单例模式
单例模式
定义
单例模式是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。
该模式有三个基本要点:
一是这个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
优点
- 节省多次加载的内存消耗
缺点
- 线程安全问题需要仔细考虑
场景
系统中某个类用来加载配置文件,如果每次加载都创建一个实例,是不是就会造成资源浪费呢?这时候使用单例模式就可以节省多次加载的内存消耗。
不同单例模式
- 饿汉式单例模式:被加载时就将自己实例化(文本代码就是如此)
- 懒汉式单例模式:第一次被引用时,才会将自己实例化
代码
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观察者模式