1) 정말 많이 쓰이고 있음, 애플리케이션 내에서 하나만 존재해야 하는
객체에 적용함. (전역변수 설정, DB 컨넥션 풀)
어느정도 개발했다면 이미 접했음
싱글톤은 인스턴스를 하나만 만들고 이 만들어진 인스턴스를
어디서든지 접근할 수 있도록 하기위한 패턴임.
인스턴스가 1개만 존재하는 것을 보증하는 패턴
2. 소스
1) 고전적인 싱글톤 패턴 구현 방법
(1) 클래스는 public, 생성자는 private 로 설정하면
다른데서 new 키워드를 쓸 수 없다.
(다른 클래스에서 인스턴스(객체) 생성이 불가능하다)
(2) public getInstance() 를 부여하고 해당 메서드 안에
new 키워드로 인스턴스를 생성한다면
모든 다른 클래스에서 getInstance() 를 통해서 생성자에
접근 가능하다.
(3) getInstance()안에 인스턴스 유무를 체크해서 없는 경우에만
객체를 생성한다면 기존 인스턴스가 있는 경우 추가로
인스턴스를 만들지 않는다.
(4) 만들었던 기존에 있던 해당 인스턴스를 리턴함으로서
한개의 인스턴스를 운용하게 됨
public class Singleton { private static Singleton uniqueInstance; private Singleton(){} public static Singleton getInstance(){ if(uniqueInstance == null){ uniqueInstance = new Singleton(); } return uniqueInstance; } }
2) 싱글톤 패턴 개선방법1 (Thread상에서 Sync 기능 추가)
멀티 스레드에서도 의도한 결과를 얻기 위해서
쓰레드의 Synchronized 를 이용하면 될듯
다른 소스는 똑같고 getInstance() 앞에 synchronized 키워드만
추가한다.
public static synchronized Singleton getInstance(){ if(uniqueInstance == null){ uniqueInstance = new Singleton(); }
3) 싱글톤 멀티스레드 동기화 개선방법
이러면 처음 호출시 바로 인스턴스는 생성되고 다른데서 호출하는
getInstance() 에서는 인스턴스만 리턴한다.
public class Singleton { private static Singleton uniqueInstance = new Singleton(); private Singleton(){} public static synchronized Singleton getInstance(){ return uniqueInstance; } }
4) 싱글톤 멀티스레드 동기화 개선방법2
3)와 같으나 다른점은 DCL(Double-Checking Locking) 기능을 써서
getInstance() 에서 동기화되는 부분을 줄이게 된다.
소스가 좀 방어적으로 작성되었지만
이중 volatile 키워드는 멀티스레드에서 동기화를 해주는 키워드임
public class Singleton { private volatile static Singleton uniqueInstance = new Singleton(); private Singleton(){} public static synchronized Singleton getInstance(){ if(uniqueInstance ==null){ synchronized (Singleton.class) { if(uniqueInstance == null){ uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
3. 다이어그램
생략
4. 관련 패턴
1) Abstract Factory 패턴
2) Builder 패턴
3) Facade 패턴
4) Prototype 패턴
댓글 없음:
댓글 쓰기