-최근에 다시 공부하게된 디자인 패턴 -

싱글톤은 무엇인가 ?

특징 : 

1. 생성자가 없다..
즉 보통 클래스를 만들때 Test  test = new Test(); 로 생성한다 . 하지만 싱글톤 패턴은 new 로 생성자를 생성할수없다.
일반 적인 클래스
public TestClass {
public TestClass(){

 
}
}
이런 구조로 생성되어있다 하지만 생성돼는 부분 빨강부분이 private로 돼어있다.
public TestClass {
private TestClass(){
}
}
이런구조면 private  글래스 안에서만 사용할수있는 함수기 때문에 외부에서 호출할수 없는 부분이다. 이러면 클래스를 전혀 사용 못하게된다.


2. 1개의 인스턴스만 만들어진다.
만약 클래스가 메모리에있다면 더이상 만들지 않고 자기 생성된 생성자를 넘겨준다 .
아래와 같은 형태로 클래스 를 넘겨 받는다.
TestClass  test = TestClass.getInstance();


public TestClass {
/*유일한 인스턴스 저장 객체 선언*/
private static TestClass uniqueInstance ;
private TestClass(){ }

/*외부에서 사용할 함수 선언 클래스를 생성할떄 쓴다 */
public static TestClass getInstance(){
if(uniqueInstance  ==null){//있는지 체크 없으면
uniqueInstance  = new TestClass (); //생성한뒤
}

return uniqueInstance  ;//성성자를 넘긴다.
}
}



어디에 적용하면 좋을까 : 
딱 보면 감이 온다. 아 싱글톤이라는 패턴은 오직 1개만 만들어서 다른 곳에서도 사용할수있는거구나.
적용할수있는 곳은

ps. 블로거 저의 개인적인 생각입니다.

1. static으로 선언해서 공통적으로 사용되는 부분 환경 설정이나
2. 내용이 변경되면 다른 클래스에서도 그부분이 또같이 적용돼어 실행되어야할때.
3. 자주사용되는 부분을 싱글톤으로 만들어 생성된는 시간을 줄이고자할떄.
보통getInstance를 얻는  패키지나 프레임워크를 보면
DB 커낵션 커낵션풀 에서 사용돼는경우가있다.


유의 사항 !!!

Thread 사용시에는 위와같은 방법은 문제가 될수있다.
1. 싱크로 나이즈를 걸어준다.
public static  synchronized TestClass getInstance(){
if(uniqueInstance  ==null){
uniqueInstance  = new TestClass ();
}
return uniqueInstance  ;
}
-- 속도가  느려지지 빠른 속도를 원하면 이 방법은 비추 .
2. 인스턴스를 처음에 만든다.
private static TestClass uniqueInstance  = new TestClass();

3. DCL(duble0checking locking ) 사용 JDK 1.5부터 가능.

public TestClass {
/*유일한 인스턴스 저장 객체 선언*/
private  volatile static TestClass uniqueInstance ;
private TestClass(){ }

/*외부에서 사용할 함수 선언 클래스를 생성할떄 쓴다 */
public static TestClass getInstance(){
if(uniqueInstance  ==null){ //있는지 체크 없으면
synchronized(TestClass.class){
if(uniqueInstance  ==null){ //다시한번채크
 
uniqueInstance  = new TestClass (); //생성한뒤
}

}
}

return uniqueInstance  ;//성성자를 넘긴다.
}
}





<----> 나름 기억 하고 싶은 말들 <---->
■ 원칙
1. 애플리케이션에서 달라지는 부분을 찾아 내고, 달라지지 않는 부분으로부터 분리 시킨다.