[] 싱글 디자인 패턴

머리말

단일 디자인 패턴은 클래스의 전역 인스턴스이 있는지 확인합니다. 생성자는 (여전히 호출 반사를 사용할 수 있지만) 호출을 방지하기 위해 비공개로 선언된다. 클래스에서 클래스의 정적 인스턴스를 선언, 인스턴스를 얻을 수있는 public 메소드를 선언합니다. 이 블로그는 수행 싱글 톤을 사용하는 단점을 구성하는 방법에 대한 간단한 구현, 스레드 안전 분석을 제공합니다.

스레드로부터의 안전성

하나의 스레드 안전한 방법은, 클래스가로드 될 때,이 멤버를 초기화, 자바 런타임 라이브러리는이 방법을 사용하는 것입니다.
두 메서드는 스레드로부터 안전하지 않습니다. 기능 (임계 영역)에 여러 스레드 경우 다른 인스턴스의 수를 반환합니다.

코드 검증

다음 코드는 사실이 보장 할 수 없습니다 두 번째의 멀티 스레딩 방법의 경우, 스레드 안전 확인 "싱글을." 각 클래스를 인쇄하여 표시 해시 코드는, 클래스 인스턴스는 고유하지 않습니다.

class Singleton {
    private static Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            try {
                Thread.sleep(233);
                singleton = new Singleton();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        return singleton;
    }
}

public class Main {
    public static void main(String args[]) {
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                public void run() {
                    Singleton singleton = Singleton.getInstance();
                    System.out.println(singleton.hashCode());
                }
            }).start();
        }
    }
}

솔루션

간단한 방법은 각 스레드가 중요한 섹션을 시작하기 위해 대기하는 때문에, 동기화 낮은 효율로 선언의 getInstance하는 것입니다.

또 다른 방법은 두 번 검사 잠금 (DCL)라고하며, 일반적인 변수 (마다 각 스레드가 변경이 변수를 참조 할 수 있도록 메모리 용량에서 촬영이 변수를 사용하려면) 휘발성 선언했다.

class Singleton {
    private volatile static Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            try {
                Thread.sleep(233);
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        return singleton;
    }
}

그래서 나쁜 것,이 디자인 패턴을 비난하지 않는다, 전역 변수 잘못이다.

1, 전역 변수

공공 자원의 싱글 관리 어디서나 코드에서 바로 싱글 인스턴스를 얻을 수있는 방법을 전화, 당신은 읽고 이러한 공공 자원에 쓸 수, 싱글 톤 인스턴스를 얻을 수 있습니다. 이 싱글은 글로벌 변수가되었다합니다.

전역 변수를 해, 싱글은 단점도. 시나리오 자체 글로벌 변수의 전역 변수의 장점의 사용은, 그들은 아무 말도하고 싶지 전역 변수의 단점에 대해 이야기 경우 양측이, 보는 분리합니다.

[2] 우리가 본 아래 매우 흥미로운 유사하게, 전역 변수의 단점을 분석하기 전에 :

동료 프로그래머 글로벌 상태를 사용하면 친구와 같은 칫솔을 사용하는 것과 같습니다 - 사람이 자신의 엉덩이를 그것을 밀어하기로 결정 때 당신은하지만 당신은 알 수 없다.

나는이 관점을 말할 수있는 사람이, 칫솔의 아마 냄새가 그것을 사용합니다. 왜 글로벌 변수의 사용을 억제하는 사람들을 규제하지?

글로벌 변수의 성격에 남자 포인트, 아무것도 할하는 데 사용할 수있는 사람은 전체 프로그램은 불확실성을 가져왔다. 피해 많은 글로벌 변수에 대한 온라인 토론은 매우 나쁜 생각을 모아 다음 :

  1. 코드 커플 링의 높은 수준. 일부 기능은 전역 상태 변수에 의존하는 가정이 함수는 전역 변수에 의해 서로 연결되어있다. 다른 기능을 읽기에 존재 수정 기능의 효과는,이 기능은 사실상 서로 연결되어 있습니다.
  2. 어려운 테스트합니다. 일부 주 저장 글로벌 변수는 올바른 테스트를 실행할 수있는 모듈의 순서를 정렬 할 필요가있다. 그러나, 상기 테스트 유닛은 오히려 순차보다 서로 독립적이어야한다.
  3. 경우에 상호 배타적 쓰기 멀티 스레드.
  4. 이는 펑션 입출력 기능을 파괴한다. 출력 쓰기, 입력을 읽어 전역 변수를 가져 가라.
  5. 충돌을 명명.
  6. 가독성을 줄일 수 있습니다. 기능을 이해하기 위해, 또한 글로벌 변수의 기능과 아웃을 추적하는 데 사용할 필요가있다.

2, 단일 책임의 원칙을 훼손

정의 : 범주에, 그것은 단지 변화의 한 원인해야

클래스가 싱글 시간을 사용하는 경우, 그것은뿐만 아니라 작업을 완료하기 위해이 클래스의 필요성에 대한 책임도 하나의 객체 자원의 생성 및 관리 할 책임이있다. 이 클래스의 기능은 두 가지 작업을 수행 상관 관계가 낮다.

이건 정말 너무 나쁘지 않다. 결국, 설계 원칙은 항상 수행 할 필요가 없습니다.

올바른 사용

단점 위에서 언급 한, 핵심 본질은 싱글이 전역 변수로 사용하지 않도록하는 것입니다. 무슨 싱글 사용 시나리오?

싱글이 클래스의 역할의 하나 개의 인스턴스를 성격을 백업 할 수 있습니다. 이 디자인 패턴의 앞에 말하기 때문에이 인스턴스를 관리 할 필요가의 단일 책임의 원칙을 훼손한다.

그것은 두 가지 이유에서이 디자인 패턴의 사용으로 요약된다 :

(1) 단일 인스턴스

관리 (2) 예의

그는 [1]에서 싱글 톤을 사용하는 구체적인 예를 말했다. 즉, 로그 (로그)입니다. 함수의 본질은 로그인하고 시스템의 기능에 큰 영향이없는 로그를 열 것인지, 그래서 코드 커플 링을 생성하지 않기 때문에.

참조 링크

  1. https://stackoverflow.com/questions/228164/on-design-patterns-when-should-i-use-the-singleton
  2. https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil
  3. https://stackoverflow.com/questions/26285520/implementing-singleton-with-an-enum-in-java
  4. https://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons?page=1&tab=votes#tab-top

추천

출처www.cnblogs.com/zhouzekai/p/11233617.html