싱글톤 디자인패턴
※싱글톤 디자인 패턴
전체 프로그램에서 단 하나의 객체만 만들도록 보장해야하는 경우
단 하나만 사용된다고 해서 싱글톤(Singleton)이라고 한다
1. 싱글톤은 클래스 외부에서 new 연산자로 호출(호출 될 때마다 객체가 생성되기 때문)할 수 없도록 private 접근 제한자를 붙여 막는다.
2. 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체 생성해 초기화 한다
ex>
//정적 필드
private static 클래스명 sigleton = new 클래스명();
→ private static FilterIndexService instance = new FilterIndexService();
/*
내가 만들어놓은 new FilterIndexService(); 이것만 가져다 사용해라 하는 의미임 private 해놓으면 외부에서 가져다 사용할 수 없음으로 FilterIndexService() 클래스에서 추가 작업을 한다
*/
//생성자
//외부에서 이 클래스를 무단으로 생성하는 것을 방지하기 위함
private 클래스() {}
→ private FilterIndexService() {}
// 정적 메소드
//이 클래스의 인스턴스가 프로그램에서 단 하나밖에 생성되지 않도록 하는 패턴
public static 클래스 getInstance() {
→ return singleton;
}
public static FilterIndexService getInstance() {
return instance;
}
//외부 클래스에서 사용하는방법
클래스 변수 1 = 클래스.getInstance();
클래스 변수 2 = 클래스.getInstance();
→ uriMapping.put("GET:/filter", FilterIndexService.getInstance());
}
메소드는 단 하나의 객체만 리턴한다. 변수1과 변수2는 동일한 객체를 참고하는 것
@Override
public void init() throws ServletException {
//service 초기화 가능
//uriMapping.put("메서드:/주소", 주소로 들어오면 갈 곳);
/*
uriMapping.put("GET:/filter", new FilterIndexService());
서비스라는 것을 만들어놨는데 계속 사용할 필요가 없기 때문에 (service 라는 건 항상 한개만 있으면 된다)
서비스에 대해 잘 모르는 사람이 new FilterIndexService() 여러개 사용하지 못하게 하려고 filterIndexService를 private으로 숨겨버린다.
private 해놓으면 외부에서 가져다 사용할 수 없음으로 FilterIndexService() 클래스에서 추가 작업을 한다
*/
/*
FilterIndexService.Instance() = null;
uriMapping.put("GET:/filter", FilterIndexService.Instance());
static 은 한번만 생성되고 수정이 어려운데, 이런식으로 값을 넣으면 안되기 때문에 개터를 달아준것이다
getInstance()로 사용하려고 함
*/
uriMapping.put("GET:/filter", FilterIndexService.getInstance());
//Calendar.getInstance(); 도 getInstance()를 사용했다.