标签:存储 构造 面向对象语言 defer 用户 职责 pac assert 运行环境
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,它提供全局访问的方法。
单例模式的要点有三个:一是某个类只能有一个实例;而是他必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
以C++实现为例,单例模式的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式包含的角色只有一个,就是单例类。单例类包含一个私有构造函数,确保用户无法通过new关键字直接实例化它。除此之外,该模式中包含一个静态私有成员变量与静态公有的工厂方法,该工厂方法负责检验实例的存在性并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
在单例模式的实现过程中,需要注意如下三点:
在以下情况下可以使用单例模式:
/*
* 使用了C++0x禁止复制以及构造的特性
*/
#include <iostream>
#include <cassert>
class President {
public:
static President& GetInstance() {
static President instance;
return instance;
}
President(const President&) = delete;
President& operator=(const President&) = delete;
private:
President() {}
};
int main() {
President& president1 = President::GetInstance();
President& president2 = President::GetInstance();
assert(&president1 == &president2);
std::cout << "president1:" << &president1 << std::endl;
std::cout << "president2:" << &president2 << std::endl;
return 0;
}
package singleton
import (
"fmt"
"math/rand"
"sync"
"sync/atomic"
)
var (
flag uint32
ins *Instance
mx sync.Mutex
once sync.Once
)
type Instance struct {
value string
}
func GetInstance() *Instance {
if atomic.LoadUint32(&flag) == 0 {
mx.Lock()
defer mx.Unlock()
atomic.StoreUint32(&flag, 1)
ins = &Instance{value: fmt.Sprintf("haha%d", rand.Uint32())}
}
return ins
}
func GetInstanceOnce() *Instance {
once.Do(func() {
ins = &Instance{value: fmt.Sprintf("hehe%d", rand.Uint32())}
})
return ins
}
测试用例
package singleton
import (
"fmt"
"testing"
)
func TestGetInstance(t *testing.T) {
for index := 0; index < 5; index++ {
ins := GetInstance()
fmt.Println(ins.value)
}
}
func TestGetInstanceMultiG(t *testing.T) {
for index := 0; index < 5; index++ {
go func() {
ins := GetInstanceOnce()
fmt.Println(ins.value)
}()
}
}
输出结果
go test -v .
=== RUN TestGetInstance
haha2596996162
haha2596996162
haha2596996162
haha2596996162
haha2596996162
--- PASS: TestGetInstance (0.00s)
=== RUN TestGetInstanceMultiG
--- PASS: TestGetInstanceMultiG (0.00s)
PASS
hehe4039455774
hehe4039455774
hehe4039455774
hehe4039455774
hehe4039455774
ok design-patterns/singleton 0.315s
标签:存储 构造 面向对象语言 defer 用户 职责 pac assert 运行环境
原文地址:https://www.cnblogs.com/jingliming/p/11819214.html