디자인 모델 - 단일 모델 (Singleton Pattern) 실현
단일 모드 (Singleton Parttern) 는 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.전역 변수 와 유사 하지만 전역 변수 보다 효과 가 좋 습 니 다. 전역 변 수 는 프로그램 시작 에 만들어 야 합 니 다. 나중에 사용 하지 않 으 면 자원 의 낭 비 를 초래 할 수 있 습 니 다.
왜 단일 모드 를 만 듭 니까?
일부 대상 은 하나만 필요 합 니 다. 예 를 들 어 스 레 드 풀 (threadPool), 캐 시 (cache), 대화 상자, 레 지 스 트 리 (registry) 의 대상, 로그 대상, 타자기, 그래 픽 카드 등 장치 의 드라이버 대상 을 충당 합 니 다.사실은 이런 대상 들 은 하나의 사례 만 있 을 수 있다. 만약 에 하나의 사례 를 만 들 면 많은 문 제 를 초래 할 수 있다. 예 를 들 어 프로그램의 행위 가 이상 하고 자원 의 사용 이 과도 하거나 일치 하지 않 는 결과 가 발생 할 수 있다.
단일 모드 의 특징:
단일 클래스 는 하나의 인 스 턴 스 만 있 을 수 있 습 니 다.
단일 클래스 는 스스로 이 인 스 턴 스 를 만들어 야 합 니 다.
단일 클래스 는 반드시 전체 시스템 이 실례 를 제공 할 것 을 스스로 생각해 야 한다.
단일 모드 의 실현 방식:
여 간
장차
구조 함수 성명 은 개인 이 고 정적 Public 로 대상 을 예화 하 며 이러한 인 스 턴 스 를 되 돌려 주 며 외부 에서 이 방법 을 호출 하여 대상 을 예화 합 니 다.
굶 주 린 한식
//
class singleton{
private:
static singleton *instance;//
singleton(){};
public:
//
static singleton* get_instance()
{
return instance;
}
};
singleton* singleton::instance = new singleton();//
2. 배 부 른 사람 (게으름뱅이) 식 단일 사례 류
class singleton{
private:
static singleton *instance;//
singleton(){};
public:
// , ,
static singleton* get_instance()
{
if(NULL == instance) <---
instance = new singleton();
return instance;
}
};
singleton* singleton::instance = NULL;//
여기에 문제 가 있 습 니 다. 만약 에 다 중 스 레 드 환경 에서 사용 하면 문제 가 발생 할 수 있 습 니 다. 예 를 들 어 두 스 레 드 가 코드 가 가리 키 는 위치 로 동시에 실 행 됩 니 다. 처음에 intance 가 모두 NULL 로 초기 화 되 었 기 때문에 두 스 레 드 는 if 에 동시에 들 어가 서 두 개의 인 스 턴 스 를 만 듭 니 다!이것 은 분명히 단일 모델 과 일치 하지 않 기 때문에 우 리 는 그것 에 대해 실례 화 된 코드 를 서로 배척 해 야 한다.
3. 상호 배척 자물쇠
잠 금 을 추가 하면 인 스 턴 스 가 비어 있 는 지 여 부 를 여러 스 레 드 로 판단 할 수 있 습 니 다.
#include <iostream>
#include <mutex>
using namespace std;
mutex mtx;//
class singleton{
private:
static singleton *instance;// Singleton
singleton(){};
public:
//
static singleton* getInstance()
{
mtx.try_lock();//
if(NULL == instance)
{
instance = new singleton();
}
mtx.unlock();//
return instance;
}
};
singleton* singleton::instance = NULL;//
4. 이중 검 측 잠 금 추가
인 스 턴 스 를 만 들 지 않 았 을 때 잠 금 을 추가 해 야 하기 때문에 인 스 턴 스 를 만 들 었 다 면 잠 금 을 추가 할 필요 가 없습니다.그래서 자 물 쇠 를 추가 하기 전에 인 스 턴 스 가 만 들 어 졌 는 지 여 부 를 판단 해 야 합 니 다.
mutex mtx;//
class singleton{
private:
static singleton *instance;// Singleton
singleton(){};
public:
//
static singleton* getInstance()
{
if(NULL == instance)
{
mtx.try_lock();//
if (NULL == instance)
{
instance = new singleton();
}
mtx.unlock();//
}
return instance;
}
};
singleton* singleton::instance = NULL;//
참고:
http://blog.csdn.net/jerryburning/article/details/46912855
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.