JavaRush /Java Blog /Random-KO /패턴과 싱글톤 - 처음 접하는 모든 사람을 위한

패턴과 싱글톤 - 처음 접하는 모든 사람을 위한

Random-KO 그룹에 게시되었습니다
이 글은 패턴이라는 개념을 처음 접하셨거나, Singleton'e'에 대해 들어보셨거나, 만들어 보셨지만 아직 아무것도 이해하지 못하신 분들을 대상으로 작성되었습니다. 환영! JavaRush 학생들은 레벨 15에서 처음으로 패턴을 접하는데, 갑자기 캡이 Singleton게으른 구현으로 패턴을 "수정"하고 구현하도록 요청합니다. 처음 듣는 학생들은 Singleton패턴이 무엇인지, 왜 필요한지, 어떤 종류의 패턴인지, Singleton마지막으로 이것이 어떤 종류의 게으른 구현인지에 대해 즉시 많은 질문을 합니다. 순서대로 답변을 시작하겠습니다. 패턴과 싱글톤 - 처음 접하는 모든 사람을 위한 - 1

어쨌든 패턴이란 무엇입니까?

더 나은 이해를 위해서는 이 질문에 역사를 통해 답하는 것이 가치가 있다고 생각합니다. 프로그래머 중에는 흥미로운 아이디어를 생각해낸 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 등 유명한 네 명의 작가가 있습니다.
패턴과 싱글톤 - 처음 접하는 모든 사람을 위한 - 2
그들은 프로그램을 작성할 때 거의 동일한 문제를 해결하고 구조적으로 동일한 유형의 코드를 작성해야 하는 경우가 많다는 사실을 발견했습니다. 따라서 그들은 객체 지향 프로그래밍에서 자주 사용되는 일반적인 패턴을 패턴 형태로 설명하기로 결정했습니다. 이 책은 1995년에 "객체 지향 설계 기술" 이라는 제목으로 출판되었습니다 . 디자인 패턴" . 책 제목이 너무 길어져서 그냥 4인방의 서( The Book of the Gang of Four )로 알려지게 되었습니다 . 첫 번째 판에서는 23개의 패턴이 출판되었고, 이후 수십 개의 패턴이 발견되었습니다. 따라서 이 단락의 "패턴이란 무엇입니까?" 라는 질문에 대답하여 몇 단어로 요약해 보겠습니다.
패턴은 일반적인 문제에 대한 표준화된 솔루션입니다.
그리고 Singleton이것은 이러한 패턴 중 하나일 뿐입니다.

패턴이 필요한 이유 (디자인 패턴)

패턴을 몰라도 프로그래밍할 수 있는데, JavaRush의 15번째 레벨까지 그 존재에 대해 아무 것도 모르고 수백 개의 미니 프로그램을 작성했다는 사실을 깨닫는 것만으로도 이를 확인할 수 있습니다. 이는 패턴이 일종의 도구이며, 그 존재로 인해 마스터와 아마추어가 구별된다는 점을 시사합니다.
패턴과 싱글톤 - 처음 접하는 모든 사람을 위한 - 3
패턴은 일반적인 문제 중 하나를 올바르게 해결하는 방법을 설명합니다. 결과적으로 패턴을 알면 시간이 절약됩니다. 알고리즘을 사용하여 비유할 수 있습니다. 예를 들어, 블랙잭과 숫자를 사용하여 자신만의 정렬 알고리즘을 고안 하고 이에 많은 시간을 할애할 수도 있고, 이미 오래 전에 설명한 것을 사용하여 구현할 수도 있습니다. 패턴도 마찬가지다. 또한, 패턴을 사용하면 코드가 더욱 표준화되고, 올바른 패턴을 사용하면 실수할 가능성이 줄어듭니다. 실수는 이미 이 패턴에서 예측되고 제거되었기 때문입니다. 게다가 패턴에 대한 지식을 통해 프로그래머는 서로를 더 잘 이해할 수 있습니다. 동료 프로그래머에게 원하는 작업을 설명하는 대신 단순히 템플릿 이름을 말하는 것으로 충분합니다. 요약하면 디자인 패턴은 다음과 같은 도움이 됩니다.
  • 바퀴를 재발명하지 말고 표준 솔루션을 사용하십시오.
  • 코드 표준화;
  • 용어 표준화;
이 섹션의 결론에서 우리는 다양한 패턴 전체를 세 가지 큰 그룹으로 단순화할 수 있다는 점에 주목합니다.
패턴과 싱글톤 - 처음 접하는 모든 사람을 위한 - 4

마지막으로 싱글턴 패턴

Singleton생성 패턴을 나타냅니다 . 문자 그대로 번역하면 외롭습니다. 이 패턴을 사용하면 클래스에 하나의 개체(클래스의 인스턴스 하나)만 있고 해당 개체에 전역 액세스 지점이 제공됩니다. 설명을 보면 이 패턴이 두 가지 경우에 사용되어야 한다는 것이 분명해집니다.
  1. 프로그램에서 클래스의 개체를 하나만 생성해야 하는 경우. 예를 들어, 컴퓨터 게임에는 "Character" 클래스가 있고 이 클래스에는 캐릭터 자체를 설명하는 개체가 하나만 있어야 합니다.

  2. 클래스 객체에 전역 액세스 포인트를 제공해야 할 때. 즉, 프로그램의 어느 곳에서나 객체가 호출되는지 확인해야 합니다. 그리고 아쉽게도 단순히 전역 변수를 생성하는 것만으로는 충분하지 않습니다. 쓰기 금지되어 있지 않고 누구나 이 변수의 값을 변경할 수 있으며 개체에 대한 전역 액세스 지점이 손실되기 때문입니다. Singleton예를 들어, 데이터베이스와 함께 작동하는 클래스의 개체가 있고 프로그램의 다른 부분에서 데이터베이스에 액세스할 수 있어야 하는 경우 이러한 속성이 필요합니다. 그리고 Singleton이전에 생성된 클래스 인스턴스를 대체하는 다른 코드가 없음을 보장합니다.
이 두 가지 문제는 다음과 같이 해결됩니다 Singleton. 프로그램에는 개체가 하나만 있어야 하며 개체에 대한 전역 액세스가 있어야 합니다. 레벨 15의 예에서 캡은 다음 작업에 대해 이 패턴을 구현하도록 요청합니다(설명은 다음과 같습니다).
패턴과 싱글톤 - 처음 접하는 모든 사람을 위한 - 5
조건을 주의 깊게 읽으면 Singleton여기에 정확히 (Single)이 필요한 이유가 분명해집니다. 결국 프로그램은 각 클래스에 대해 하나의 개체( Sun, Moon, ) 를 생성하도록 요청합니다 Earth. 그리고 프로그램의 각 클래스가 태양/달/지구를 하나만 생성해야 한다고 가정하는 것이 논리적입니다. 그렇지 않으면 자신만의 스타워즈 버전을 작성하지 않는 한 터무니없는 일이 될 것입니다. 세 단계의 Java 구현Singleton 기능 Java의 싱글톤 동작은 생성자가 항상 새 객체를 반환하기 때문에 일반 생성자를 사용하여 구현할 수 없습니다. 따라서 Singleton'a의 모든 구현은 생성자를 숨기고 단일 개체의 존재를 제어하고 새로 나타나는 모든 개체를 "파괴"하는 공개 정적 메서드를 만드는 것으로 귀결됩니다. 'a가 호출 되면 Singleton새 객체를 생성하거나(아직 프로그램에 없는 경우) 이미 생성된 객체를 반환해야 합니다. 이렇게 하려면: #1. – 단일 객체를 포함하는 클래스에 전용 정적 필드를 추가해야 합니다.
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance; //#1
}
#2. – 클래스 생성자(기본 생성자)를 비공개로 만듭니다(클래스 생성자에 대한 액세스가 클래스 외부에서 닫히면 새 객체를 반환할 수 없음).
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){} // #2
}
#삼 . – 싱글톤을 얻는 데 사용될 정적 생성 방법을 선언합니다.
public class LazyInitializedSingleton {
    private static LazyInitializedSingleton instance;
        private LazyInitializedSingleton(){}
        public static LazyInitializedSingleton getInstance(){ // #3
        if(instance == null){		//if the object has not been created yet
            instance = new LazyInitializedSingleton();	//create a new object
        }
        return instance;		// return the previously created object
    }
}
위의 예는 단순히 생성자를 숨기고 표준 생성자 대신 자체 메서드를 제공하기 때문에 다소 어색합니다. 이 기사는 JavaRush 학생들이 처음으로 이 패턴(및 일반적인 패턴)을 접할 수 있도록 하는 것을 목표로 하고 있으므로 더 복잡한 싱글톤의 구현 기능은 여기서 제공하지 않습니다. 프로그램의 복잡성에 따라 이 패턴을 더 세부적으로 개선해야 할 수도 있다는 점만 참고하세요. 예를 들어 다중 스레드 환경(스레드 항목 참조)에서 여러 다른 스레드가 동시에 Singleton의 getter 메서드를 호출할 수 있으며, 위에 설명된 코드는 작동을 중지합니다. 각 개별 스레드가 클래스의 여러 인스턴스를 생성할 수 있기 때문입니다. 한 번에. 따라서 올바른 Thread-safe 싱글톤을 생성하는 데는 여전히 여러 가지 접근 방식이 있습니다. 그러나 그것은 또 다른 이야기입니다 =) 그리고 마지막으로. 캡이 요구한 지연초기화란 무엇입니까 ?지연초기화는 지연초기화라고도 합니다. 이는 리소스 집약적인 작업(객체 생성은 리소스 집약적인 작업)을 미리 수행하는 것이 아니라 요청 시 수행하는 프로그래밍 기술입니다. 기본적으로 코드 Singleton'a'에서 일어나는 일입니다. 즉, 객체는 미리 생성되는 것이 아니라 액세스되는 순간 생성됩니다. 지연 초기화 개념이 어떻게든 'om'과 엄격하게 연결되어 있다고 가정해서는 안 됩니다 Singleton. 지연 초기화는 프록시 및 팩토리 메소드와 같은 다른 생성적 디자인 패턴에도 사용되지만 이는 또 다른 이야기입니다. =) 기사를 준비하는 데 다음 소스가 사용되었습니다.
  1. 예제가 포함된 Java 싱글톤 디자인 패턴 모범 사례
  2. 디자인 패턴
  3. Java의 올바른 싱글톤
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION