단일 모드 "유일 하지 않 음"

5917 단어 디자인 모드
모두 가 singleton 이라는 디자인 모델 을 만 든 대상 이 모두 유일한 것 이 라 고 말한다. 그러면 블 로 거들 은 오늘 초보 자 들 에 게 알려 주지 않 은 '단일 모델 주의사항' 을 알려 준다.디자인 모델 이라는 책 을 본 독자 들 은 모두 알 고 있다. 단일 모델 / singleton 의 주요 출발점 은 유일한 대상 을 만 드 는 것 이다. 그래서 구조 함 수 를 private 구성원 (방법) 으로 써 외부 에서 새로운 대상 을 직접 만 들 지 않도록 하 는 것 이다.이 유일한 대상 을 얻 기 위해 서 는 Public 구성원 (방법) 에서 통 일 된 구조 GET 나 이 유일한 대상 을 제공 합 니 다.그렇다면 문제 가 생 겼 다. 대상 을 만 드 는 또 다른 방법, 복사 구 조 는 어디로 갔 을 까??그래서 블 로 거들 은 다음 과 같은 코드 가 있 는 실험 을 했다.
class Single
{
private:
    static Single sig;
    Single();
    Single(const Single&);
    //.....
public
    static Single& Get()
    {
        return sig;
    }
};

결말 을 맞 혀 보 세 요. 맞아요. 프로그램 이 Single: Get () 을 호출 할 때 오류 가 발생 했 습 니 다. 오류 원인, 복사 구조 함 수 는 개인 적 인 것 입 니 다.이 유 는 다음 과 같 습 니 다. 프로그램 이 실제 호출 할 때 이미 존재 하 는 대상 sig 로 Get () 을 구조 적 으로 호출 하 는 대상 입 니 다. 즉, 구조 함 수 를 복사 하려 면 Public 이 어야 합 니 다.새로운 문제 가 또 발생 했다. 앞에서 언급 한 '복사 구조 함수' 는 새로운 대상 을 만 드 는 데 쓰 인 다. 단일 모드 로 만 든 대상 이 유일 하지 않다 는 것 이 아니 겠 는가?bingo, 맞 혔 습 니 다. 단일 모드 로 만 든 대상 은 유일한 것 이 아 닙 니 다.블 로 거들 은 의 심 스 러 운 태 도 를 가지 고 항소 사례 모델 에 이런 구성원 방법 을 추가 했다.
void Show_add()const
    {
        cout<<"& Single :"<cout<<"this :"<<this<

의심 할 필요 가 없습니다. 이것 은 class Single 의 한 Public 의 구성원 입 니 다. 현재 대상 의 주소 와 유일한 대상 의 주 소 를 직접 출력 하면 구분 할 수 있 습 니 다. 이른바 '유일한 대상' 이 유일 합 니까?하, 결 과 는 정말 내 가 알 아 맞 혔 다. 두 주소 의 차 이 는 십 만 팔 천 리 였 다. 즉, 대상 이 유일한 것 이 아니 었 다.저 는 이 결 과 를 정말 믿 지 않 습 니 다. 그래서 이 Singleton 의 유형 에 멤버 와 멤버 방법 을 추가 하여 테스트 를 했 습 니 다. 다음 과 같 습 니 다.
class Single
{
private:
    static Single sig;
    static int a; //    10
    int b;  //    100
    const char *str; //     "abcdefg"
    Single();
public
    single(const single&);
    static Single& Get();
    void Show()const;   //        
    void Show_add()const; //         sig   
    void Add(int num) //   static          +    
    {
        a += num;
        b += num;
    }
};

유형 방법의 실현 은 더 이상 말 하지 않 겠 습 니 다. 그 테스트 부분 은 다음 과 같 습 니 다.
    Single s1 = Single::Get();
    Single s2 = Single::Get();
    s1.Add(10); // s1   a   b    10
    s1.Show();  //  s1  
    s2.Show();  //  s2  
    s1.Show_add(); //  s1   sig     
    s2.Show_add(); //  s2   sig     

결 과 는 다음 과 같 습 니 다. 독자 의 읽 기 편 의 를 위해 저 는 s1 대상 의 s2 대상 의 각 출력 을 수 동 으로 나 누 었 습 니 다.
s1:: a :20
     b :110
     str :abcdefg
s2:: a :20
     b :100
     str :abcdefg
s1:: & Single :00E80218
     this :00FCFAA8
s2:: & Single :00E80218
     this :00FCFA98

위 에서 알 수 있 듯 이 1. 단일 모델 의 등장 대상 은 유일한 것 이 아니다. /유일한 대상 sig 에 게 서 복사 구 조 를 통 해 얻 은 후에 원래 의 대상 과 아무런 관계 가 없다.
그러면 새로운 문제 가 생 겼 습 니 다. '단일 예' 를 어떻게 실현 합 니까? (같은 메모리 조작) 정 답 은 모든 구성원 (변수) 을 static 로 쓰 면 Get () 방법 으로 얻 은 모든 대상 이 호출 하 는 모든 방법 은 static 구성원 에 대한 조작 입 니 다. 하하, 다 중 스 레 드 에서 의 안전 통 제 를 기억 하 세 요.
블 로 거들 도 궁금 하 다. 그러면 '유일한 대상' 을 이 룰 수 없다. 그러면 우리 가 평소에 말 하 는 '단일 모드' (모든 멤버 변 수 는 static) 의 크기 는 얼마 일 까? 답 은 1 이다. 그래, 그 는 빈 클래스 다. 우리 가 실현 하 는 모든 방법 은 외부 에 함수 인 터 페 이 스 를 제공 할 뿐 외부 에 보이 지 않 는 다 (private 멤버).의 변수 가 제공 하 는 조작 방식
요약: 단일 대상 이 유일 하지 않 습 니 다. 단일 모델 은 빈 클래스 이 고 크기 (sizeof) 는 1 입 니 다. sizeof 가 1 이 아 닌 클래스 를 구 하 는 것 은 단일 모델 이 아 닙 니 다. 그러나 크기 가 1 인 클래스 는 반드시 단일 모델 이 아 닙 니 다.

좋은 웹페이지 즐겨찾기