23 가지 디자인 모델 (1)창설 형단일 모드 (Singleton Pattern)

정의: 하나의 클래스 가 하나의 인 스 턴 스 만 있 는 지 확인 하고 자체 적 으로 예화 하여 전체 시스템 에 이 인 스 턴 스 를 제공 합 니 다.
형식: 클래스 모드 만 들 기
아 날로 그:
아 날로 그 지식 포인트:
1. 유형 도 는 세 부분 으로 나 뉘 는데 그 다음은 유형 명, 속성, 방법 이다.
2. < < 시작 과 시작 > > 으로 끝 나 는 주석 정보
3. 수정자 + public 를 대표 합 니 다. - private 를 대표 합 니 다. \ # proctected 를 대표 합 니 다. 아무것도 대표 하 는 가방 이 없습니다.
4. 밑줄 친 속성 이나 방법 은 정적 임 을 나타 낸다.
5. 도표 에서 대상 의 관계 에 익숙 하지 않 은 친 구 는 글 을 참고 할 수 있다. 디자인 모델 에서 의 관계.
단일 모델 은 23 가지 디자인 모델 중에서 가장 간단 한 모델 일 것 이다.그것 은 다음 과 같은 몇 가지 요소 가 있다.
사유 구조 방법 자신의 인 스 턴 스 를 가리 키 는 개인 정적 참조 자신의 인 스 턴 스 를 반환 값 으로 하 는 정적 공유 방법         단 례 모델 은 실례 화 대상 의 시기 에 따라 두 가지 로 나 뉜 다. 하 나 는 굶 주 린 한식 단 례 이 고 하 나 는 게 으 른 한식 단 례 이다.굶 주 린 한식 단 례 는 단 례 류 가 불 러 올 때 한 대상 을 실례 화하 여 자신의 인용 에 맡긴다.게으름뱅이 식 은 인 스 턴 스 방법 을 호출 할 때 만 대상 을 예화 한다.
1. 고전 모드:
public class Singleton
{
        private static Singleton instance;

        private Singleton()
        {
        
        }

        public static Singleton GetInstance()
        {
                if(instance==null)
                {
                        instance=new Singleton();
                }
                return instance;
        }
}

해석 은 다음 과 같 습 니 다.
1) 우선, 이 Singleton 의 구조 함 수 는 반드시 개인 적 이 어야 하 며, 클 라 이언 트 프로그램 이 new () 작업 을 통 해 하나의 인 스 턴 스 를 만들어 하나의 사례 를 실현 하 는 목적 을 달성 하지 않도록 해 야 한다.
2) 정적 변수의 생명 주 기 는 전체 프로그램의 생명 주기 와 같 기 때문에 개인 적 인 정적 전역 변수 인 스 턴 스 를 정의 하여 이러한 종류의 유일한 인 스 턴 스 를 저장 할 수 있 습 니 다.
3) 전역 함수 접근 을 통 해 이 인 스 턴 스 를 얻 고 이 함수 에서 인 스 턴 스 수량 을 제어 하 는 기능 을 제공 해 야 합 니 다. 즉, if 문 구 를 통 해 인 스 턴 스 가 예화 되 었 는 지 여 부 를 판단 하고 없 으 면 new () 와 인 스 턴 스 를 만 들 수 있 습 니 다.그렇지 않 으 면 고객 에 게 직접 인 스 턴 스 를 되 돌려 줍 니 다.
이러한 고전 모드 에서 스 레 드 와 인 스 턴 스 문 제 를 고려 하지 않 았 습 니 다. 즉, 두 스 레 드 가 동시에 인 스 턴 스 인 스 턴 스 인 스 턴 스 를 가 져 올 수 있 습 니 다. 이때 null 일 때 두 스 레 드 가 각각 인 스 턴 스 를 만 들 고 하나의 규칙 을 위반 할 수 있 습 니 다.따라서 위의 코드 를 수정 해 야 한다.
2. 다 중 스 레 드 에서 의 단일 사례 모델
1. 레이 지 모드
public class Singleton
{
       private static Singleton instance;
       private static object _lock=new object();

       private Singleton()
       {

       }

       public static Singleton GetInstance()
       {
               if(instance==null)
               {
                      lock(_lock)
                      {
                             if(instance==null)
                             {
                                     instance=new Singleton();
                             }
                      }
               }
               return instance;
       }
}

상기 코드 는 이중 잠 금 방식 을 사용 하여 다 중 스 레 드 에서 의 단일 모델 실현 을 잘 해결 했다.먼저 내부 의 if 구문 블록 을 보고 이 구문 블록 을 사용 할 때 먼저 잠 금 작업 을 하여 하나의 스 레 드 만 이 구문 블록 에 접근 할 수 있 도록 한 다음 에 하나의 인 스 턴 스 만 만 만 들 었 음 을 보증 합 니 다.외부 if 문 구 를 다시 보면 모든 스 레 드 가 인 스 턴 스 를 얻 으 려 면 매번 잠 금 을 추가 하지 않 아 도 됩 니 다. 인 스 턴 스 가 비어 있 을 때 (즉, 인 스 턴 스 를 만들어 야 합 니 다) 만 잠 금 을 추가 하여 만 들 수 있 습 니 다. 인 스 턴 스 가 존재 한다 면 이 인 스 턴 스 를 직접 되 돌려 성능 을 절약 할 수 있 습 니 다.
2. 굶 주 린 남자 모델
이런 모델 의 특징 은 자신의 주동 적 인 실례 이다.
public sealed class Singleton
{
        private static readonly Singleton instance=new Singleton();
 
        private Singleton()
        {
        }

        public static Singleton GetInstance()
        {
               return instance;
        }
}

위 에서 사용 하 는 readonly 키 는 static 와 함께 사용 할 수 있 습 니 다. 이 상수 가 분류 급 이 라 고 지정 할 수 있 습 니 다. 초기 화 는 정적 구조 함수 에 의 해 이 루어 지고 실행 할 때 컴 파일 할 수 있 습 니 다.이런 모델 에서 스스로 스 레 드 안전성 문 제 를 해결 할 필요 가 없고 CLR 이 해결 해 줄 것 이다.이 클래스 가 불 러 올 때 이 클래스 를 자동 으로 예화 합 니 다. GetInstance () 를 처음 호출 한 후에 야 유일한 단일 대상 을 실례 화 하지 않 아 도 됩 니 다.
단일 모드 의 장점:
메모리 에 대상 이 하나 밖 에 없어 서 메모리 공간 을 절약 합 니 다.
잦 은 소각 대상 생 성 을 피하 고 성능 을 향상 시 킬 수 있 습 니 다.
공유 자원 의 다 중 점용 을 피하 다.
전역 접근 이 가능 합 니 다.
적용 장면: 단일 모델 의 이상 장점 때문에 프로 그래 밍 에서 비교적 많이 사용 하 는 디자인 모델 이다.나 는 내 가 아 는 단일 모드 를 사용 하기에 적합 한 장면 을 정리 했다.
빈번 한 실례 화 를 거 쳐 소각 해 야 할 대상.
대상 을 만 드 는 데 너무 많은 시간 이 걸 리 거나 자원 을 너무 많이 소모 하지만 자주 사용 하 는 대상 입 니 다.
상태 있 는 도구 클래스 대상.
데이터베이스 나 파일 에 자주 접근 하 는 대상.
그리고 내 가 사용 하지 않 았 던 모든 요 구 는 대상 이 한 명 밖 에 없 는 장면 이다.
단일 모드 주의사항:
단일 클래스 가 제공 하 는 방법 으로 만 단일 대상 을 얻 을 수 있 으 며, 반 사 를 사용 하지 마 십시오. 그렇지 않 으 면 새로운 대상 을 예화 할 것 입 니 다.
단일 클래스 의 대상 과 클래스 의 정적 인용 을 차단 하 는 위험 동작 을 하지 마 십시오.
다 중 스 레 드 는 단일 사례 로 공유 자원 을 사용 할 때 스 레 드 안전 문제 에 주의 하 십시오.
게으름뱅이 식 단일 스 레 드 안전 합 니까?
        주로 인터넷 의 일부 설 에 따 르 면 게으름뱅이 식 의 단일 사례 모델 은 스 레 드 가 안전 하지 않다. 실례 화 대상 의 방법 에 synchronized 키 워드 를 추가 하 더 라 도 위험 하 다. 그러나 필 자 는 인 코딩 테스트 를 통 해 synchronized 키 워드 를 수정 한 후에 성능 에 일부 영향 을 미 치지 만 스 레 드 가 안전 하 다 는 것 을 발견 했다.여러 대상 을 예화 하 는 상황 은 일어나 지 않 는 다.
단일 모드 는 굶 주 린 사람 식 과 게 으 른 사람 식 두 가지 밖 에 없 나 요?
        굶 주 린 한식 단 례 와 게 으 른 한식 단 례 는 두 가지 주류 와 자주 사용 하 는 단 례 모델 방법 일 뿐이다. 이론 적 으로 말하자면 한 가지 실례 만 실현 할 수 있 는 디자인 모델 은 모두 단 례 모델 이 라 고 할 수 있다.
 
단일 클래스 는 계승 할 수 있 습 니까?
        굶 주 린 한식 단 례 와 게 으 른 한식 단 례 는 구조 방법 이 private 이기 때문에 그들 은 모두 계승 할 수 없 지만 다른 많은 단 례 모델 은 계승 할 수 있다. 예 를 들 어 등록 식 단 례 이다.
굶 주 린 사람
        자바 에 서 는 굶 주 린 사람 이 게 으 른 사람 보다 낫다.C + + 에 서 는 일반적으로 게으름뱅이 식 단 례 를 사용한다.
단일 모드 가 비교적 간단 하 므 로 여기 서 예 를 들 어 코드 를 보 여 주지 않 겠 습 니 다.

좋은 웹페이지 즐겨찾기