>  기사  >  백엔드 개발  >  싱글톤 패턴 및 일반적인 작성 방법 분석(디자인 패턴 01)

싱글톤 패턴 및 일반적인 작성 방법 분석(디자인 패턴 01)

黄舟
黄舟원래의
2017-02-13 11:39:291242검색

클래스에 인스턴스가 하나만 있는지 확인하고 인스턴스에 대한 전역 액세스 지점을 제공합니다.

——"디자인 패턴"

싱글턴 모드의 개념은 매우 간단합니다. C# 언어를 예로 들어 일반적인 싱글톤 작성 방법의 장점과 단점을 나열합니다.

1. 간단한 구현

아아아아

댓글:


스레드에 안전하지 않음
단일 스레드에서 요구 사항 충족
장점:
인스턴스가 Instance 속성 메서드 내부에서 생성되므로 클래스는
추가 기능을 사용하여 객체에 인스턴스가 필요할 때까지 인스턴스화를 수행하지 않을 수 있습니다. 이 접근 방식을 "지연 인스턴스화"라고 합니다. 지연 인스턴스화는 애플리케이션이 시작될 때 불필요한 싱글톤 인스턴스화를 방지합니다.


2. 스레드 안전성

 public sealed class Singleton
    {
        static Singleton instance = null;

        public void Show()
        {
            Console.WriteLine(  "instance function");
        }
        private Singleton()
        {
        }

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



댓글:

프로그램에서 동시에 잠긴 유일한 부분 time은 스레드가 들어갈 수 있습니다.
객체 인스턴스는 먼저 들어오는 스레드에 의해 생성됩니다.
나중에 스레드는 들어갈 때 false가 되며(인스턴스 == null) 반환되지 않음 객체 인스턴스 생성
오버헤드가 추가되고 성능이 저하됨


3. 이중 잠금

아아아아

댓글:


멀티 스레드 안전
스레드는 매번 잠기지 않습니다
객체에 처음 액세스할 때까지 인스턴스화를 지연할 수 있습니다.


4. 정적 초기화

public sealed class Singleton
    {
        static Singleton instance = null;
        private static readonly object padlock = new object();

        private Singleton()
        {
        }

        public static Singleton Instance
        {
            get
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }

                return instance;
            }
        }
    }

댓글:


공용 언어 런타임을 사용하여 변수 초기화를 처리합니다.
공개 정적 속성은 액세스하는 방법을 제공합니다. 인스턴스 전역 액세스 포인트
인스턴스화 메커니즘에 대한 제어가 적음(.NET으로 구현)
정적 초기화는 .NET에서 Singleton을 구현하는 데 선호되는 방법입니다

중요:

정적 생성자에는 액세스 수정자가 없으며 C#에서는 자동으로 이를 비공개로 표시하므로 For private으로 표시해야 합니다. ,

은 개발자가 작성한 코드가 호출되지 않도록 방지하기 위한 것이며 호출은 항상 CLR의 책임입니다.







5. 초기화 지연

 public sealed class Singleton
    {
        static Singleton instance = null;
        private static readonly object padlock = new object();

        private Singleton()
        {
        }

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }

댓글:


초기화 작업이 완료되었습니다 중첩 클래스에 의해 이는 정적 멤버를 사용하여 수행되므로 초기화가 지연됩니다.

정적 함수를 호출하는 시점은 클래스가 인스턴스화되거나 정적 멤버가 호출될 때이기 때문에 그리고 .net 프레임워크는 정적 생성자를 호출하여 정적 멤버 변수를 초기화하는데, 그래서 네 번째 방법에 따라 작성하면, Hello 메서드가 다시 호출되면 싱글톤 인스턴스가 인스턴스화됩니다. 이는 우리가 보고 싶은 것이 아닙니다. 왜냐하면 우리는 Hello 메서드만 사용하고 싶을 수도 있기 때문입니다.


참고:

1. 싱글톤 모드의 인스턴스 생성자는 하위 클래스 파생을 허용하도록 보호되도록 설정할 수 있습니다.
2. 싱글톤 모드는 일반적으로 ICloneable 인터페이스를 지원하지 않습니다. 이는 싱글톤 모드의 원래 의도에 어긋나는 여러 개체 인스턴스가 발생할 수 있기 때문입니다.
3. 싱글톤 모드는 일반적으로 직렬화를 지원하지 않습니다. 이는 또한 싱글톤 모드의 원래 의도에 어긋나는 여러 객체 인스턴스로 이어질 수 있기 때문입니다.
4. 싱글톰 모드는 객체 생성 관리만 고려하고, 객체 소멸 관리는 고려하지 않습니다. 가비지 수집과 객체 오버헤드를 지원하는 플랫폼의 경우 일반적으로 객체 파기에 대한 특별한 관리를 수행할 필요가 없습니다.


요약:

1. 클래스 생성을 개선하기보다는 패턴을 제한합니다.
2. 싱글턴 패턴을 이해하고 확장하는 핵심은 "new를 사용하여 클래스 생성자에 대한 사용자의 임의 호출을 제어하는 ​​방법"입니다.
3. 싱글톤을 쉽게 수정하여 몇 가지 인스턴스를 가질 수 있습니다.


위는 싱글턴 패턴과 공통 작문 분석(디자인 패턴 01)의 내용이며, 관련 내용 더 보기 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.