# Java Singletone Design Pattern

# Java Singletone Design Pattern

by jihoon kim

HTML

<style>
.MJXp-math.MJXp-display {
  display:inline !important;
}
</style>
<div id="contents">
#### 원본 : https://examples.javacodegeeks.com/core-java/java-singleton-design-pattern-best-practices-examples/
# Singletone

## Singletone Design Pattern?
  - Singleton 패턴은 Creational 디자인 패턴의 일부.
  - Java에서 new키워드는 필요할 때마다 클래스의 인스턴스를 작성합니다.
      그러나 개발자가 다음과 같은 클래스의 독립 인스턴스를 가져야하는 경우도 있습니다.
      - 단일 데이터베이스 연결 개체
      - 단일 공유 리소스
    ![텍스트](http://examples.javacodegeeks.com/wp-content/uploads/2018/07/jcg-singleton_design_pattern_architecture_diag._1.jpeg)

## 전제 조건
  - 정적 멤버 : static클래스 레벨 변수 와 마찬가지로 JVM 메모리에 단일 인스턴스를 생성 합니다.
  - Private Constructor : 외부 세계로부터 Singleton 클래스의 인스턴스 생성을 제한합니다 (즉, new키워드를 사용하여이 클래스의 초기화 가 방지됩니다)
  - 정적 팩토리 메소드 : 이것은 Singleton 객체에 대한 전역 액세스 지점을 제공하고 인스턴스를 호출자에게 반환합니다.

## 구조
  - 단일 인스턴스의 소유권은 변경할 수 없습니다.
  - 게으른 초기화가 권장됩니다.
  - 싱글 톤 인스턴스에 대한 전역 액세스는 별도로 제공되지 않습니다.

## SingletonClassDemo.java
```java
package com.java.design.pattern.singleton;

// Lazy Initialization
public class SingletonClassDemo {

	// Static attribute.
	private static SingletonClassDemo instance = null;

	// Private constructor.
	private SingletonClassDemo() {

	}

	// Static function.
	public static SingletonClassDemo getInstance() {
		// If there is no instance available, create new one (i.e. lazy initialization).
		if (instance == null) {
			instance = new SingletonClassDemo();
		}
		return instance;
	}
}
```

## Eager Initialization
```java
package com.java.design.pattern.singleton;

// Eager Initialization
public class SingletonClassDemo2 {

	// Static attribute.
	// Making the "instance" attribute as "final" ensures that only one instance of the class exists.
	private static final SingletonClassDemo2 instance = new SingletonClassDemo2();

	// Private constructor.
	private SingletonClassDemo2() {

	}

	// Static function.
	public static SingletonClassDemo2 getInstance() {
		return instance;
	}
}
```

  - Static Initialization
```java
// Static block initialization...