[2] 디자인패턴 - 싱글톤 패턴(Singleton Pattern)

2023. 7. 16. 17:02cs및 소프트스킬/디자인 패턴

728x90
반응형
SMALL

1. 싱글톤 패턴 (Singleton Pattern)

- 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴

- 데이터 베이스 연결 모듈에 많이 사용

- 비용은 줄여드는 대신 의존성이 높음

- 많은 클래스가 존재할 경우 비효율적 (모듈간 결합도가 높다.)

- 주로 DB 연결할때 사용

 

 

2. 싱글톤 패턴 개념 이해 (JS)

 

아래와 같이 예시 코드를 작성

다음은 object1과 object2의 a값이 27이 같지만, 객체는 참조형이므로 주소를 참조한다.

따라서, object1과 object2의 객체는 서로 다른 객체를 확인 가능하다.

const object1 = { a: 27 }

const object2 = { a: 27 }

// 실행 결과 : false
console.log(object1 === object2);

 

 

다음은 싱글톤 패턴을 구현합니다.

class SingletonPattern {
	// 이 코드는 생성 시, 각각 다른 객체이므로
    // 서로 같은 객체로 생성하는 것을 한다.
	constructor() {
    	if (!SingletonPattern.instance) {
        	SingletonPattern.instance = this;
        }
        return SingletonPattern.instance;
    }
    
    getInstance() {
    	return this.instance;
    }
}

const object1 = new SingletonPattern();
const object2 = new SingletonPattern();

// 해당 값은 생성자의 의해 각각 다른 객체일 경우 하나의 객체로 취급합니다.
// 값 : true
console.log(a === b)

 

 

3. 싱글톤 패턴 적용(Java)

// 싱글톤 클래스 적용
class SingletonPattern {
    private class singleInstanceHolder {
    	private final Singleton INSTANCE = new SingletonPattern();
    }
    
    public static SingletonPattern getInstance() {
    	return singleInstanceHolder.INSTANCE;
    }

}


// 싱글톤 클래스 테스트
public class SingletonTest {
	public static void main(String[] args) {
    	SingletonPattern singleton1 = SingletonPattern.getInstance();
        SingletonPattern singleton2 = SingletonPattern.getInstance();
        
        // 싱글톤 패턴이 일치시, 출력
        // 결과는 출력이 가능하다.
        if (singleton1 == singleton2) {
        	System.out.println(true);
        }
    }
}

 

 

 

 

 

4. 싱글톤 패턴 적용 예(JS) - 데이터 베이스 연결 모듈

const URL = 'mysql://localhost:3306/myDB';
const createConnection = url => ({"url": url});

// 이 값을 어떠한 객체 변수를 선언하든
// 해당 클래스의 값이 같을 수 있다는 것을 
// 알 수 있습니다.
class DBConnection {
	constructor(url) {
    	if (!DBConnection.instance) {
        	DBConnection.instance = createConnection(url);
        }
        return DBConnection.instance;
    }
    
    connect() {
    	return this.instance
    }
}

 

 

 

 

 

 

 

 

728x90
반응형
LIST