안녕하세요 여러분, javaRush!
Singleton
오늘은 디자인 패턴 (싱글) 에 대해 말씀드리겠습니다 .
목표: 객체가 하나만 있는 클래스를 만듭니다. 즉, 액세스 횟수에 관계없이 처음 생성된 동일한 객체가 반환됩니다. 이는 편리하고 많은 곳에서 필요한 일이며, 프레임워크에 구현되는 것은 아무것도 아닙니다.
애플리케이션:
- 예를 들어, 데이터베이스를 프로젝트 및 해당 연결을 담당할 클래스에 연결해야 합니다. 연결은 한 번 생성되며 다시 생성할 필요가 없습니다.
Application settings
— 애플리케이션에 필요한 연결 설정(데이터베이스 호스트 및 포트 등)을 담당하는 클래스입니다. 한 번 생성되어 애플리케이션 작업 전반에 걸쳐 사용됩니다.
- 제가 언급하지 않은 예시가 더 많이 있으므로 댓글에 옵션을 적어주세요! =)
이 소개 후에 제가 이해하는 바에 따르면 이 클래스의 예를 보여줄 수 있습니다. (비록 우리 각자가 이것을 구현할 수 있다고 확신하지만) 다음은 생성자를 비공개로 만드는 가장 간단한 예입니다. 명시적으로 개체를 만들 수는 없습니다.
getInstance()
그리고 객체를 제공하는 정적 메서드가 있습니다 .
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
멀티스레딩에 문제가 있는 경우
getInstance()
마커 메소드를 넣을 수 있습니다
synchronized
.
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
마지막으로 평소와 마찬가지로 생각이 다르시거나 제게 틀린 부분이 있다면 댓글로 적어주세요! 모든 것을 즐겁게 논의하겠습니다 :) 기사가 마음에 드셨다면 "+"를 적어주시면 알려드리겠습니다.
이것은 나에게 중요합니다 :) 추신: 더 많은 구현을 추가하고 있습니다. Joshua Bloch 에 따르면 이것이 템플릿을 구현하는 가장 좋은 방법입니다.
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
그리고 더 나아가
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
지연 초기화
+
고성능
-
비정적 클래스 필드에는 사용할 수 없습니다. 질문/제안 사항이 있으면 의견을 적어주세요!
내 다른 기사도 참조하십시오.
GO TO FULL VERSION