728x90
생성패턴이란?
- 생성패턴은 인스턴스를 만드는 절차를 추상화하는 패턴
- 객체를 생성, 합성하는 방법을 시스템과 분리해주며, 시스템이 상속(inheritance)보다 복합(composite)방법을 사용하는 방향으로 진화되어 가면서 더 중요해짐
생성패턴 주요 포인트
- 생성패탄은 시스템이 어떤 Concrete Class를 사용하는지에 대한 정보를 캡슐화
- 클래스의 Instance들이 어떻게 만들고 어떻게 결합하는지에 대한 부분을 완전히 은닉
싱글톤 패턴이란?
- 생성 패턴 중 하나로, 인스턴스를 오직 한 개만 만들어서 제공하는 클래스 가 필요한 경우에 사용하는 패턴
정의(Definition)
- 소프트웨어 디자인 패턴에서 싱클톤 패턴(Singleton Pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.
- 객체를 메모리에 한번만 올리고, 해당 메모리에 다시 접근한다.
사용이유?
- 메모리, 속도 측면 : 객체의 인스턴스를 재사용하기 때문(고정된 메모리 영역을 사용)
- 데이터 공유가 쉬움 : 기존 인스턴스가 전역으로 사용되기 때문
- 인스턴스가 한 개만 존재하는 것을 보장하고 싶은 경우
싱글톤 패턴 구현
- 주의할점
- 인스턴스는 생성 이후 수정이 되지 않도록 막아준다, 생성 이후에 해당 클래스의 인스턴스를 NULL로 초기화 해버릴수도 있기 때문이다
/**
* private 생성자와 public static 메소드를 사용하는 방법
*/
public class Settings1 {
private static Settings1 instance;
//밖에서 new을 사용하지 못하게 하기 위해
//private 생성자 생성
private Settings1() { }
//글로벌 접근이 가능하게 하기 위해
// static 생성
public static Settings1 getInstance() {
//생성자가 없을때만 생성자 생성
if (instance == null) {
instance = new Settings1();
}
return instance;
}
}
문제점
멀티 쓰레드를 사용할 시 동시에 조건에 진입하게 되면 두개의 인스턴스가 만들어 지는 문제점 발생
문제해결 방법 - 1
- synchronized 를 사용하여 한개의 쓰레드만 들어오게 하는 방법
- getInstance를 이용할때 마다 synchronized 처리를 하기 때문에 성능 저하가 일어날 수 있다.
/**
* private 생성자와 public static 메소드를 사용하는 방법
*/
public class Settings1 {
private static Settings1 instance;
//밖에서 new을 사용하지 못하게 하기 위해
//private 생성자 생성
private Settings1() { }
//글로벌 접근이 가능하게 하기 위해
// static 생성
//synchronized를 이용해서 한개의 쓰레드만 들어오게 하는 방법
public static synchronized Settings1 getInstance() {
//생성자가 없을때만 생성자 생성
if (instance == null) {
instance = new Settings1();
}
return instance;
}
}
문제해결 방법 - 2
- 이른 초기화(eager initialization) 사용하기
/**
* private 생성자와 public static 메소드를 사용하는 방법
*/
public class Settings {
//미리 생성자를 생성
private static final Settings INSTANCE = new Settings();
//밖에서 new을 사용하지 못하게 하기 위해
//private 생성자 생성
private Settings() { }
public static Settings GetInstance() {
return INSTANCE;
}
}
문제해결 방법 - 3(권장)
- double checked locking 사용하기
- 자바 1.5부터 사용가능
/**
* private 생성자와 public static 메소드를 사용하는 방법
*/
public class Settings1 {
private static volatile Settings1 instance;
//밖에서 new을 사용하지 못하게 하기 위해
//private 생성자 생성
private Settings1() { }
public static Settings1 getInstance() {
//생성자가 없을때만 생성자 생성
if (instance == null) {
synchronized(Settings1.class){
if(instance == null){
instance = new Setting();
}
}
}
return instance;
}
}
문제해결 방법 - 4(권장)
- static inner 클래스 사용하기
- 자바 1.4이하에서도 사용가능한 방법
/**
* private 생성자와 public static 메소드를 사용하는 방법
*/
public class Settings1 {
private Settings1() {}
private static class SettingHolder(
private static final Settings1 INSTANCE = new Settings1 ();
)
public static Settings1 getInstance() {
return SettingHolder.INSTANCE;
}
}
728x90
'이론 > GoF' 카테고리의 다른 글
[생성패턴] 프로토타입패턴 (0) | 2023.06.01 |
---|---|
[생성패턴] 빌더패턴 (0) | 2023.05.23 |
[생성패턴] 추상팩토리 패턴 (0) | 2023.05.22 |
[생성패턴] 팩토리 메소드 패턴 (0) | 2023.05.22 |
[생성패턴] 싱글톤 패턴 깨트리기 (0) | 2023.05.21 |