[디자인 모드 노트] 단일 모드 싱글 톤 패턴

단일 모델 은 비교적 간단 한 모델 로 프로젝트 에서 도 자주 사용 할 수 있다.
디 테 일 구현
클래스 의 구조 방법 을 개인 (private) 으로 설정 하고 공유 (Public) 방법 으로 클래스 의 인 스 턴 스 를 가 져 옵 니 다.
코드 예제
public class Singleton {
	
	private static Singleton singleton= null;
	
	public static Singleton getSingleton(){
		if(singleton==null){
			singleton = new Singleton();
		}
		return singleton;
	}
	
	private Singleton(){
		//System.out.println("new singleton");
	}		
}

위의 이 예 는 높 은 병발 상황 에서 동기 화 문제 가 발생 할 수 있 습 니 다. 만약 에 하나의 스 레 드 가 if 판단 을 완성 하지만 대상 이 완성 되 지 않 았 을 때 다른 스 레 드 도 if 판단 을 하면 메모리 에 여러 개의 인 스 턴 스 가 발생 할 수 있 습 니 다. 스 레 드 안전 을 위해 다음 과 같은 두 가지 방법 을 사용 할 수 있 습 니 다.
첫 번 째 방법 은 직접 예화 류 이다.
public class Singleton {
	
	private static Singleton singleton= new Singleton();
	
	public static Singleton getSingleton(){		
		return singleton;
	}
	
	private Singleton(){
		//System.out.println("new singleton");
	}		
}

두 번 째 방법, if 판단 에 잠 금 추가
public class ConcurrentSingleton {

	private static ConcurrentSingleton singleton = null;
	
	private ConcurrentSingleton(){
		//System.out.println("new singleton");
	}
	
	public static ConcurrentSingleton getSingleton(){
		if(singleton==null){
			createSingleton();
		}
		return singleton;
	}

	private static synchronized void createSingleton() {
		if(singleton==null){
			singleton = new ConcurrentSingleton();
		}
		
	}
}

단일 모델 의 장단 점
장점 은 메모리 에 하나의 인 스 턴 스 만 존재 하고 메모리 비용 과 생 성, 소각 대상 의 성능 손실 을 줄 이 며 자원 에 대한 다양한 점용 을 피하 고 자원 접근 을 최적화 하고 공유 할 수 있다 는 것 이다.
단점 은 확장 이 어렵 다 는 것 이다.
단일 모드 확장
하나의 클래스 가 한 정 된 개수 의 인 스 턴 스 만 생 성 할 수 있다 면 확장 사례 를 통 해 이 루어 질 수 있 습 니 다.
코드 인 스 턴 스
public class MultiInstanceSingleton {
	
	private static int maxInstanceSize = 5;
	
	private int number = 0;
	
	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

	private static Vector<MultiInstanceSingleton> vec = new Vector<MultiInstanceSingleton>();
	
	private MultiInstanceSingleton(){
		
	}
	
	private MultiInstanceSingleton(int num){
		this.number = num;
	}
	
	private static synchronized MultiInstanceSingleton createInstance(){
		return new MultiInstanceSingleton(vec.size());
	}
	
	public static MultiInstanceSingleton getInstance(){
		MultiInstanceSingleton instance = null;
		if(vec.size()<maxInstanceSize){
			instance = createInstance();
			vec.add(instance);
		}else{
			int num = new Random().nextInt(maxInstanceSize);
			instance = vec.elementAt(num);
		}
		return instance;
		
	}
	
	public void doSomething(){
		System.out.println("  "+this.number+" ");
	}
	
	public static void main(String[] args) {
		for(int i=0;i<50;i++){
			getInstance().doSomething();	
		}
	}

}

좋은 웹페이지 즐겨찾기