- 对象不唯一,浪费内存空间,相互覆盖。
用小写字母开头默认private
- 饱汉模式
package main
import ("fmt")
type config struct {
Name string
}
var cfg *config
func initConfig() *config {
if cfg==nil {
cfg = &config{"config"}
return cfg
}else{
return cfg
}
}
func main() {
f:=initConfig()
fmt.Println(f.Name)
}
- 饿汉模式
package main
import ("fmt")
type config struct {
Name string
}
var cfg *config =&config{"config"}
func initConfig() *config {
return cfg
}
func main() {
f:=initConfig()
fmt.Println(f.Name)
}
- 线程安全
package main
import (
"fmt"
"sync"
"time"
)
type config struct {
Name string
}
var cfg *config
var oSingle sync.Once
func initConfig() *config {
oSingle.Do(
func() {
cfg = &config{"config"}
})
// cfg = &config{"config"}
//比较用
return cfg
}
func main() {
//fmt.Println(&cfg.Name)
for i := 0; i <3; i++ {
go func() {
initConfig()
fmt.Println(&cfg.Name)
// fmt.Println(&cfg)
//访问指针的地址木有用,因为指针地址没变,变的是struct对象
}()
}
time.Sleep(time.Second)
}
- 使用map来存储 string -> object 利用内存做缓存
C++版Singleton(static变量配static函数)
class CSingleton
{
private:
CSingleton() //构造函数是私有的
{
}
static CSingleton *m_pInstance;
public:
static CSingleton * GetInstance()
{
if(m_pInstance == NULL) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
};
网友评论