문제

음과 같은 사실을 직시해야 합니다.단일 패턴 매우 논란이 항목은 무리와 프로그래머에 모두 양쪽의 울타리입니다.사람들이 있다는 느낌과 같은 단일 아무것도 더 다음 영광역 변수,및 다른 사람을 맹세하는 패턴을 사용하여 그것은 끊임없이.나는 원하지 않는 싱글 논란 거짓말을의 중심에는 나의 질문,그러나입니다. 모든 사람이 할 수 있는 줄다리기는 전쟁과 전투에 그것을 밖으로 우리를 위해 모든 관리.내가 무슨 말 하려고,믿지 않는 거기에 하나의 올바른 대답하고 나가지하려고 의도적으로 불을 붙이 당파 논쟁.나는 단순히 관심이 싱글-안 때 묻는 질문:

들은 어떤 특정한 대안을 GOF 단일 패턴?

예를 들어,여러 번 있을 때 사용한 단일 패턴,과거에 나는 단순히 보존에 관심 있는 국가/의 값은 하나 또는 여러 가지 변수입니다.국가/변수의 값을,그러나,보존할 수 있는 사이에 각각의 인스턴스를 사용하여 클래스 정적 변수 를 사용하는 대신 단일 패턴이다.

다른 어떤 아이디어 있습니까?

편집: 내가 정말 원하지 않는 이를 다른 게시물에 대한"사용하는 방법의 단일을 올바르게." 다시,나는 방법을 찾고 있다면 반드시 피해야 합니다.에 대한 재미있는,ok?난 묻는 순수 학문에서 최고의 영화 예고편 목소리로,"평행 우주에서 어디에도 없는 단일 무엇을 하리이까?"

도움이 되었습니까?

해결책

Alex Miller에서 "내가 싫어하는 패턴"다음을 인용합니다.

"싱글 톤이 대답처럼 보일 때, 나는 종종 더 현명하다는 것을 알았습니다.

  1. 싱글 톤의 인터페이스 및 기본 구현 생성
  2. 시스템의 "상단"에서 기본 구현의 단일 인스턴스를 구성하십시오. 이는 스프링 구성 또는 코드에 있거나 시스템에 따라 다양한 방식으로 정의 될 수 있습니다.
  3. 단일 인스턴스를 필요한 각 구성 요소로 전달하십시오 (종속성 주입)

다른 팁

해결 방법 싱글 톤을위한 올바른 방법을 이해하려면 싱글 톤 (및 글로벌 주)에 무엇이 잘못되었는지 이해해야합니다.

싱글 톤은 의존성을 숨 깁니다.

그게 왜 중요한가요?

왜냐하면 의존성을 숨기면 커플 링량을 추적하는 경향이 있습니다.

당신은 그것을 주장 할 수 있습니다

void purchaseLaptop(String creditCardNumber, int price){
  CreditCardProcessor.getInstance().debit(creditCardNumber, amount);
  Cart.getInstance().addLaptop();
}

보다 간단합니다

void purchaseLaptop(CreditCardProcessor creditCardProcessor, Cart cart, 
                    String creditCardNumber, int price){
  creditCardProcessor.debit(creditCardNumber, amount);
  cart.addLaptop();
}

그러나 적어도 두 번째 API는이 방법의 공동 작업자가 무엇인지 정확히 명확하게합니다.

따라서 해결 방법은 정적 변수 나 서비스-로이터를 사용하는 것이 아니라 싱글 톤 클래스를 인스턴스로 변경하는 것입니다. 이는 인스턴스로 변경하는 것입니다. IOC- 프레임 워크를 사용하여이를 처리하거나 수동으로 수행 할 수도 있지만 중요한 것은 글로벌 상태를 제거하고 종속성과 협업을 명시 적으로 만드는 것입니다.

내가 만난 가장 좋은 솔루션은 공장 패턴을 사용하여 수업의 인스턴스를 구성하는 것입니다. 패턴을 사용하면 가능합니다 보증 그것을 사용하는 객체들 사이에서 공유되는 클래스의 인스턴스는 하나뿐입니다.

관리하기가 복잡하지만이 블로그 게시물을 읽은 후 "모든 싱글 톤은 어디로 갔습니까?", 그것은 너무 자연스럽게 보입니다. 그리고 따로, 그것은 단위 테스트를 분리하는 데 많은 도움이됩니다.

요약하면, 당신은 무엇을해야합니까? 객체가 다른 객체에 의존 할 때마다 생성자를 통해서만 인스턴스를받습니다 (클래스의 새로운 키워드 없음).

class NeedyClass {

    private ExSingletonClass exSingleton;

    public NeedyClass(ExSingletonClass exSingleton){
        this.exSingleton = exSingleton;
    }

    // Here goes some code that uses the exSingleton object
}

그리고 공장.

class FactoryOfNeedy {

    private ExSingletonClass exSingleton;

    public FactoryOfNeedy() {
        this.exSingleton = new ExSingletonClass();
    }

    public NeedyClass buildNeedy() {
        return new NeedyClass(this.exSingleton);
    }
}

공장을 한 번만 인스턴스화하므로 Exsingleton의 단일 인스턴스화가 있습니다. BuildNeedy라고 부를 때마다 새로운 NeedyClass 인스턴스는 Exsingleton과 번들로 연결됩니다.

이게 도움이 되길 바란다. 실수를 지적하십시오.

Spring 또는 다른 IOC 함유자는 그에 따라 합리적으로 잘 수행됩니다. 클래스가 앱 자체 외부에서 만들어 관리되고 관리되므로 컨테이너는 간단한 클래스를 만들어 필요한 경우 주입 할 수 있습니다.

패턴을 피하기 위해 길을 벗어날 필요는 없습니다. 패턴의 사용은 설계 결정이거나 자연스러운 착용감입니다 (단지 제자리에 떨어집니다). 시스템을 설계 할 때는 패턴을 사용하거나 패턴을 사용할 수 있도록 선택할 수 있습니다. 그러나 궁극적으로 디자인 선택 인 것을 피하기 위해 길을 벗어나서는 안됩니다.

나는 싱글 톤 패턴을 피하지 않습니다. 적절하고 사용하거나 사용하거나 적절하지 않아 사용하지 않습니다. 나는 그것이 그렇게 간단하다고 믿는다.

싱글 톤의 적절성 (또는 그 부족)은 상황에 따라 다릅니다. 그것은 디자인 결정으로 결정되어야하며 그 결정의 결과를 이해하고 문서화해야합니다.

그만큼 하나씩 일어나는 것 패턴은 a 서비스 세트를 제공하려면 단일 객체가 필요합니다..

이 경우에도 여전히 글로벌 정적 필드/속성 인스턴스를 나타내는 것은 부적절합니다. 정적 필드와 객체가 제공하지 않는 객체 사이의 코드에 종속성을 생성하기 때문에 부적절합니다.

따라서 클래식 한 싱글 톤 패턴 대신 서비스 'Like'패턴을 사용하는 것이 좋습니다. 서비스 컨테이너, 정적 필드를 통해 싱글 톤을 사용하는 대신 필요한 서비스 유형을 요청하는 AA 방법을 통해 이에 대한 참조를 얻습니다.

*pseudocode* currentContainer.GetServiceByObjectType(singletonType)
//Under the covers the object might be a singleton, but this is hidden to the consumer.

단일 글로벌 대신

*pseudocode* singletonType.Instance

이런 식으로 싱글 톤에서 다른 것으로 바꾸고 싶을 때, 당신은 그것을 쉽게 할 수 있습니다. 또한 추가 혜택으로 모든 방법에 대한 객체 인스턴스를 전달할 필요는 없습니다.

또한 참조하십시오 제어의 역전, 아이디어는 싱글 톤을 소비자에게 직접 노출시킴으로써 객체가 제공 한 객체 서비스가 아니라 소비자와 객체 인스턴스 간의 종속성을 만듭니다.

내 의견은 숨다 싱글 톤 패턴의 사용은 가능할 때마다 항상 피할 수 없거나 바람직하지 않기 때문에 가능할 때마다 사용됩니다.

Monostate (Robert C. Martin의 민첩한 소프트웨어 개발에 설명)는 Singleton의 대안입니다. 이 패턴에서 클래스의 데이터는 모두 정적이지만 getters/setter는 정적이 아닙니다.

예를 들어:

public class MonoStateExample
{
    private static int x;

    public int getX()
    {
        return x;
    }

    public void setX(int xVal)
    {
        x = xVal;
    }
}

public class MonoDriver
{
    public static void main(String args[])
    {
        MonoStateExample m1 = new MonoStateExample();
        m1.setX(10);

        MonoStateExample m2 = new MonoStateExample();
        if(m1.getX() == m2.getX())
        {
            //singleton behavior
        }
    }
}

Monostate는 싱글 톤과 비슷한 행동을 가지고 있지만 프로그래머가 싱글 톤이 사용되고 있다는 사실을 반드시 알 필요는없는 방식으로 그렇게합니다.

싱글 톤을 사용하여 단일 데이터 객체를 나타내는 경우 대신 메소드 매개 변수로 데이터 객체를 전달할 수 있습니다.

(하지만 이것이 처음에 싱글 톤을 사용하는 잘못된 방법이라고 주장합니다)

문제가 상태를 유지하려는 경우 MumbleManager 클래스를 원합니다. 시스템 작업을 시작하기 전에 클라이언트가 MumbleManager를 만듭니다. 여기서 Mumble은 시스템의 이름입니다. 주정부는 그것을 통해 유지됩니다. 당신의 mumblemanager는 당신의 주를 보유하는 부동산 백을 포함 할 가능성이 있습니다.

이 유형의 스타일은 매우 C와 같은 느낌이 들며 객체와는 다릅니다. 시스템을 정의하는 객체는 모두 동일한 mumblemanager를 참조 할 것입니다.

일반 물체와 공장 물체를 사용하십시오. 공장은 구성 정보 (예 : 포함)와 동작으로 만 인스턴스 및 일반 객체 세부 사항을 정책하는 책임이 있습니다.

실제로 설계하는 경우 오른쪽에 처음부터 피하 Singeltons 되지 않을 수도 있습을 사용하지 않는 싱글이 사용하여 정적 변수입니다.사용하는 경우 정적 변수를,당신은 또한 만들기 단독이 더 많거나 적은,유일한 차이점은 당신이 만드는 다른 객체를 인스턴스,그러나 내부적으로 그들은 모두 행동을 만들었을 사용하여 단일.

할 수 있 당신은 아마 자세히 들을 사용하는 단일 또는 곳에 단일 현재 사용하고 당신은 당신을 사용하지 않도록 노력하고 그것은?이 사람들을 도울 수 있을 찾을 더 화려한 솔루션이 어떻게 상황을 처리 할 수없는 단일의 모든.

BTW,저는 개인적으로 문제가 없 싱글이고 내가 이해할 수 없다는 문제는 다른 사람들에 관한 싱글.나는 아무것도 나쁜 것들입니다.는 경우,당신은 당신을 악용되지 않습니다.모든 유용한 기술 학대될 수 있는 경우 학대,이어질 것입니다 부정적인 결과입니다.는 또 다른 기술은 일반적으로 오용 상속이 있습니다.아직도 아무도 말을 상속가 뭔가 나쁜 때문에 어떤 사람들은 끔찍하게 남용니다.

개인적으로 나를 위해 싱글 톤처럼 행동하는 것을 구현하는 훨씬 더 현명한 방법은 완전히 정적 클래스 (정적 멤버, 정적 메소드, 정적 특성)를 사용하는 것입니다. 대부분의 시간에 나는 이런 식으로 구현합니다 (사용자 관점과는 다른 행동 차이를 생각할 수 없습니다).

싱글 톤을 경찰하기 가장 좋은 곳은 클래스 디자인 수준에 있다고 생각합니다. 이 단계에서는 클래스 간의 상호 작용을 매핑하고 절대적으로 무언가를 확인할 수 있어야합니다.이 클래스의 1 인스턴스만이 애플리케이션 수명의 언제라도 존재해야합니다.

이 경우 싱글 톤이 있습니다. 코딩 중에 싱글 톤을 편리하게 던지는 경우 디자인을 다시 방문하고 코딩을 중단해야합니다. :)

그렇습니다. '경찰'은 '피하는'것이 아니라 여기서 의미하는 단어입니다. 싱글 톤은 피해야 할 것이 아닙니다 (Goto와 Global 변수가 피해야 할 것이없는 것과 같은 방식으로). 대신, 당신은 그것을 사용하는 것을 모니터링하고 원하는 것을 효과적으로 얻는 가장 좋은 방법인지 확인해야합니다.

나는 싱글 톤을 주로 "메소드 컨테이너"로 사용하며 상태가 전혀 없다. 이러한 방법을 많은 클래스와 공유해야하고 인스턴스화 및 초기화의 부담을 피하려면 컨텍스트/세션을 만들고 모든 클래스를 초기화합니다. 세션을 지칭하는 모든 것은 그에 포함 된 "싱글 톤"에도 액세스 할 수 있습니다.

강렬한 객체 지향 환경 (예 : Java)에서 프로그래밍하지 않은 나는 토론의 복잡성에 완전히 관심이 없다. 그러나 PHP 4에서 싱글 톤을 구현했습니다. 나는 자동으로 초기화되고 불완전하고 다소 깨진 프레임 워크로 기능 호출을 전달하거나 아래로 내려갈 필요가없는 '블랙 박스'데이터베이스 핸들러를 만드는 방법으로 수행했습니다.

싱글 톤 패턴의 일부 링크를 읽은 후에는 다시 같은 방식으로 구현할 것이라고 확신합니다. 실제로 필요한 것은 공유 스토리지 (예 : 실제 데이터베이스 핸들)가있는 여러 객체였으며 이것은 내 호출이 바뀌었던 것입니다.

대부분의 패턴과 알고리즘과 마찬가지로 싱글 톤을 사용하는 것은 단지 시원하기 때문에 잘못된 일입니다. 나는 싱글 톤처럼 보이는 진정한 '블랙 박스'전화가 필요했습니다. 그리고 IMO는 질문을 다루는 방법입니다. 패턴을 알고 있어야하지만 더 넓은 범위와 인스턴스가 고유 한 수준을 살펴보십시오.

당신은 무엇을 의미합니까, 그것을 피하기위한 나의 기술은 무엇입니까?

그것을 "피"하는 것은 싱글 톤 패턴이 자연스럽게 적합한 상황이 많기 때문에 이러한 상황을 해소하기 위해 몇 가지 조치를 취해야한다는 것을 의미합니다.

그러나 없습니다. 싱글 톤 패턴을 피할 필요가 없습니다. 단순히 발생하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top