"아이 하나만 낳 아 요" - 디자인 모델 중의 단일 모델
4. 567917. 머리말 은 81955 ° 81955 ° 사람들 에 게 단일 모델 이 무엇 인지 물 었 는데 갑자기 대답 하지 못 해 기억 에 남지 않 는 것 같다.돌아 가서 수업 을 보충 해 보 니 프로젝트 에서 계속 사용 하 던 로그 모듈 은 하나의 예 모드 를 사 용 했 을 뿐 묵 과 했 을 뿐 의식 하지 못 했 을 뿐 이라는 것 을 깨 달 았 다.예 를 들 어 하나의 인 스 턴 스 (Instance) 만 있 고 외부 에 이 인 스 턴 스 를 방문 하 는 전체 방문 점 을 제공 하 는 것 을 말한다.* 8195: 8195: 보통 우 리 는 전체 변 수 를 사용 하여 '아이 하나만 낳 기' 를 실현 할 수 있 지만 더 좋 은 방법 은 이런 자신 이 이 를 만 들 고 보존 하 는 유일한 인 스 턴 스 를 만 드 는 것 이다.이 종 류 는 다른 인 스 턴 스 가 생 성 되 지 않 고 이 인 스 턴 스 를 방문 하 는 방법 을 제공 할 수 있 습 니 다.다음은 구체 적 인 실현 을 살 펴 보 자
4. 567917. 단일 모드 는 8195 ℃ 에서 하나의 Singleton 류 를 정의 하고 정적 방법 GetInstance 를 추가 하여 자신의 유일한 인 스 턴 스 를 만 들 고 클 라 이언 트 가 방문 할 수 있 도록 합 니 다
class Singleton
{
private:
Singleton()
{
}
static Singleton *m_pInstance;
public:
static Singleton * GetInstance()
{
if(m_pInstance == NULL) // , new 。
m_pInstance = new Singleton();
return m_pInstance;
}
//
void DoWork()
{
printf("the work is done!");
}
};
* 8195: 8195 주의: 구조 함 수 는 private 로 설정 하면 외부 에서 new 연산 자 를 통 해 이 종 류 를 예화 할 수 없습니다.클 라 이언 트 접근 방법:
Singleton* p1 = Singleton :: GetInstance();
Singleton* p2 = p1->GetInstance();
Singleton & ref = * Singleton :: GetInstance();
p1->DoWork();
p2->DoWork();
ref.DoWork();
Singleton :: GetInstance()->DoWork();
4. 567917. 문제 토론 다 중 스 레 드 환경 에서 여러 스 레 드 가 Singleton 류 의 GetInstance 방법 을 동시에 방문 하면 여러 개의 인 스 턴 스 를 만 들 수 있 습 니 다.따라서 잠 금 보 호 를 해 야 합 니 다. lock 체 제 를 사용 하여 하나의 스 레 드 가 코드 의 임계 구역 에 있 을 때 다른 스 레 드 가 방문 하면 차단 되 어 기다 릴 수 있 고 임계 구역 에 들 어가 지 않도록 해 야 합 니 다.이렇게 실현 할 수 있다.
class Singleton
{
private:
Singleton()
{
}
static Singleton *m_pInstance;
CCriticalSection m_cs; //
public:
static Singleton * GetInstance()
{
if(NULL == m_pInstance) // , new 。
{
lock(m_cs) //
{
if(NULL == m_pInstance) //
{
m_pInstance = new Singleton();
}
}
}
return m_pInstance;
}
//
void DoWork()
{
printf("the work is done!");
}
};
왜 2 차 판단 을 해 야 합 니까? 제1차 NULL = = mpInstance 판단 은 매번 자 물 쇠 를 채 워 효율 을 높이 는 것 을 피하 기 위 한 것 이다. 두 번 째 판단 은 인 스 턴 스 가 생 성 되 지 않 으 면 두 스 레 드 가 동시에 1 층 NULL = m 를 통과 하기 때 문 입 니 다.pInstance 는 lock 체제 로 인해 첫 번 째 스 레 드 만 들 어 오고 다른 줄 을 서서 기다 리 고 있 습 니 다. 첫 번 째 스 레 드 가 인 스 턴 스 를 만 들 고 나 오 면 두 번 째 스 레 드 가 들 어간 후에 도 새로운 인 스 턴 스 를 만 들 수 있 습 니 다.
이 를 통 해 알 수 있 듯 이: 한 아이 만 낳 을 수 있 도록 항상 유의 해 야 합 니 다. 곳곳에 주의 하 세 요. 안전 조 치 는 절대적 으로 보장 해 야 합 니 다. O (∩ ∩) O.
저작권 성명: 본 고 는 csdn 블 로 거 [applebite] (http://blog.csdn.net/applebite) 오리지널 글 은 전재 할 때 출처 를 밝 히 고 권리 침 해 는 반드시 추궁 해 야 한다.위 챗 공식 번호 추가: qichuang 또는 엽기 혁신 플랫폼
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.