[01] Go 디자인 모델: 단일 모드 (Singleton)
단일 모드
프로필
단일 모델 (Singleton Pattern) 은 소프트웨어 디자인 에서 가장 간단 한 디자인 모델 중 하나 이다.이런 유형의 디자인 모델 은 창설 형 모델 에 속 하 는데, 이것 은 창설 대상 을 만 드 는 가장 좋 은 방법 을 제공한다.
이 모델 은 하나의 단일 클래스 와 관련 되 는데 이 클래스 는 자신의 대상 을 만 드 는 것 을 책임 지고 하나의 대상 만 생 성 되 는 것 을 확보한다.이 종 류 는 유일한 대상 을 방문 하 는 방식 을 제공 하여 직접 방문 할 수 있 으 며, 이러한 대상 을 예화 할 필요 가 없다.
주의:
코드 구현
1. 게으름뱅이 모드
비 스 레 드 안전.만 들 고 있 을 때 Lazy Instance = nil 에 접근 하 는 스 레 드 가 있 습 니 다. 단일 클래스 에 여러 개의 인 스 턴 스 가 있 습 니 다.
var LazyInstance *Instance
func GetLazyInstance() *Instance {
if LazyInstance == nil {
LazyInstance = &Instance{
Counter: 0,
Name: "LazyInstance",
}
}
return LazyInstance
}
2. 굶 주 린 남자 모델
초기 화 에 시간 이 걸 리 면 성능 이 느 립 니 다.
var HungryInstance = &Instance{Name: "HungryInstance", Counter: 0}
func GetHungryInstance() *Instance {
return HungryInstance
}
3. 개량 형 게으름뱅이 모델
읽 을 때마다 자 물 쇠 를 채 우 는 것 이 좋 습 니 다. 더 많은 경우 자 물 쇠 를 채 우지 않 아 도 됩 니 다.
var mu sync.Mutex
var LazyInstancePlus *Instance
func GetLazyInstancePlus() *Instance {
mu.Lock()
defer mu.Unlock()
if LazyInstancePlus == nil {
LazyInstancePlus = &Instance{
Counter: 0,
Name: "LazyInstancePlus",
}
}
return LazyInstancePlus
}
비 었 을 때 만 자 물 쇠 를 채 워 성능 을 향상 시 켰 다.
var LazyInsPlusPlus *Instance
func GetLazyInsPlusPlus() *Instance {
if LazyInsPlusPlus == nil {
mu.Lock()
defer mu.Unlock()
LazyInsPlusPlus = &Instance{
Counter: 0,
Name: "LazyInsPlusPlus",
}
}
return LazyInsPlusPlus
}
4. sync. once 실현
var once sync.Once
var SyncOnceInstance *Instance
func GetInstanceSyncOnce() *Instance {
once.Do(func() {
SyncOnceInstance = &Instance{
Counter: 0,
Name: "SyncOnceInstance",
}
})
return SyncOnceInstance
}
5. 테스트 사례
package main
import (
"fmt"
"sync"
)
type Instance struct {
Name string
Counter int //
}
func (i *Instance) Hello() {
fmt.Printf("%s: my current counter is:%d
", i.Name, i.Counter)
}
//
func main() {
//
ls := GetLazyInstance()
ls.Hello()
ls.Counter += 1
ls1 := GetLazyInstance()
ls1.Hello()
//
hs := GetHungryInstance()
hs.Hello()
hs.Counter += 10
hs1 := GetHungryInstance()
hs1.Hello()
//
lsp := GetLazyInstancePlus()
lsp.Hello()
lsp.Counter += 100
lsp1 := GetLazyInstancePlus()
lsp1.Hello()
lspp := GetLazyInsPlusPlus()
lspp.Hello()
lspp.Counter += 1000
lspp1 := GetLazyInsPlusPlus()
lspp1.Hello()
//sync once
sc := GetInstanceSyncOnce()
sc.Hello()
sc.Counter += 10000
sc1 := GetInstanceSyncOnce()
sc1.Hello()
}
결과:
LazyInstance: my current counter is:0
LazyInstance: my current counter is:1
HungryInstance: my current counter is:0
HungryInstance: my current counter is:10
LazyInstancePlus: my current counter is:0
LazyInstancePlus: my current counter is:100
LazyInsPlusPlus: my current counter is:0
LazyInsPlusPlus: my current counter is:1000
SyncOnceInstance: my current counter is:0
SyncOnceInstance: my current counter is:10000
전체 코드 와 테스트 용례:https://gitee.com/ncuzhangben/GoStudy/tree/master/go-design-pattern/01-Singleton
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.