학습 단례 모드의 필기

5917 단어
단례 모델은 흔히 볼 수 있는 개발 모델인데 어떻게 프로그래밍에서 유일한 실례를 실현할 수 있습니까?
시스템에 대응하는 실례가 하나만 존재하려면 두 가지 요소가 필요하다.
① 실례를 만드는 데는 구조 방법을 사용해야 하며 구조 방법이 사유임을 보증한다.
이렇게 하면 다른 클래스에서 이 클래스를 만드는 대상을 제한할 수 있습니다.비록 이 종류가 밀봉류가 아니더라도,
이 클래스를 계승하는 하위 클래스에서도 부류 대상과 하위 클래스 대상을 만들 수 없습니다. 왜냐하면 만들 때
부류의 구조 방법을 사용하지만, 사유의 부류 구조 방법은 자류에서 사용할 수 없다.
② 정적 메서드 또는 속성 또는 읽기 전용 필드가 객체 유형을 반환합니다.
다른 클래스에서 새로운 실례를 만들 수 없으니 유일한 실례는 이 클래스의 정의에서만 제공할 수 있습니다.
다른 종류에서 이 실례를 얻을 수 있도록 정적 구성원이 필요하다. 그렇지 않으면 헛수고가 된다.
가장 간단한 형식은 다음과 같다.
class God
    {
        /// <summary>
        ///  
        /// </summary>
        private God()
        {
        }

        /// <summary>
        ///  
        /// </summary>
        public static God OnlyGod
        {
            // 
            get { return new God(); }
        }

        /// <summary>
        ///  
        /// </summary>
        /// <returns></returns>
        public static God ReturnonlyGod()
        {
            return new God();
        }

        /// <summary>
        ///  
        /// </summary>
        public static readonly God ReturnonlyGod = new God();
    }

단일 모드를 만들 때 파라미터가 필요하면 정적 방법으로 되돌아오는 것을 선택할 수 있습니다.
주의해야 할 것은 이 세 가지 방법, 속성 또는 필드가 공존할 수 없다는 것이다. 그렇지 않으면 단례 실례가 아니라 이례 모델, 삼례 모델이다.다음과 같습니다.
Console.WriteLine(ReferenceEquals(God.OnlyGod,God.ReturnonlyGod()));     //False

 
물론 이것은 가장 표준적인 것이 아니다.일반적으로 사유의 정적 변수를 정의하여 하나의 예로 인용해야 하기 때문에 흔히 볼 수 있는 것은
 public class God
    {
        /// <summary>
        ///  
        /// </summary>
        private static God _onlygod = null;

        /// <summary>
        ///  
        /// </summary>
        private God()
        {
        }
        /// <summary>
        ///  
        /// </summary>
        public static God OnlyGod
        {
            //_onlygod , _onlygod = new God(), 
            // _onlygod
            get
            {
                return _onlygod ??(_onlygod = new God());
            }
        }
    }

개인 정적 변수 정의 시 new God () 를 직접 초기화할 수도 있습니다.완만한 로드를 따르기 위해서는 위에 있는 것이 좋다.
단일 모델의 실현을 확보하기 위해서는 몇 가지가 필요하다. ICloneable()를 계승하지 말고, 서열화를 지원하지 말고, 다중 노드 환경에 대응할 수 없다.
말하기: 단일 모드는 남용할 수 없고 안전성 문제를 피할 수 있다. 주로 다중 노드의 상황을 고려하면 다중 노드는God류의 여러 가지 실례를 얻을 수 있다.
평행우주에서 세상에 같은 잎이 두 개 없는 것은 반드시 그렇지는 않다는 뜻이다.
그래서 단례 모델에 대해 일정한 수정을 해야 한다
보조 변수 + 더블 통과Lock+Volatile
  public class God
    {
        /// <summary>
        ///  +volatile( )
        /// </summary>
        private static volatile God _onlygod = null;

        /// <summary>
        /// + 
        /// </summary>
        private static object LockHelper = new object();

        /// <summary>
        ///  
        /// </summary>
        private God()
        {
        }
        /// <summary>
        ///  
        /// </summary>
        public static God OnlyGod
        {
            get
            {
                //+ 
                if (_onlygod == null)
                {
                    lock (LockHelper)
                    {
                        if (_onlygod == null)
                        {
                            _onlygod = new God();
                        }
                    }
                }
                return _onlygod;
            }
        }
    }

: new 。

좋은 웹페이지 즐겨찾기