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