생성 패턴 : 싱글톤 패턴

1c2·2024년 4월 10일
0

CS

목록 보기
13/18

싱글톤 패턴

싱글톤 패턴은 클래스에 오직 하나의 인스턴스만 가지는 패턴이다. 데이터베이스 연결 모듈 같이 인스턴스 생성에 많은 비용이 드는 곳에 주로 쓰이며, 인스턴스 생성을 효율적으로 할 수 있다는 장점이 있다. 하지만 의존성이 높아지고 TDD를 할 때 불편한 단점이 있다.

싱글톤이 아닌 클래스 예시

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}
const a = new Rectangle(1, 2)
const b = new Rectangle(1, 2)
console.log(a === b) // false

싱글톤패턴 - js

class Singleton {
 constructor() {
   if (!Singleton.instance) {
     Singleton.instance = this
   }
   return Singleton.instance
 }
 getInstance() {
 	return this
 }
}
const a = new Singleton()
const b = new Singleton()
console.log(a === b) // true

이와 같은 방식으로 싱글톤 패턴을 JavaScript에서 구현할 수 있다. 싱글톤 패턴을 사용함으로써, 동일한 인스턴스에 대한 중복 생성을 방지하고, 메모리를 효율적으로 사용할 수 있는 장점을 얻을 수 있다.

DB연결 모듈

const URL = 'mongodb://localhost:27017/kundolapp';
const createConnection = url => ({ url: url });
class DB {
  constructor(url) {
    if (!DB.instance) {
      DB.instance = createConnection(url);
    }
    return DB.instance;
  }
  connect() {
    return this.instance;
  }
}
const a = new DB(URL);
const b = new DB(URL);
console.log(a === b); // true

MongoDB 연결 모듈

Mongoose.prototype.connect = function (uri, options, callback) {
  const _mongoose = this instanceof Mongoose ? this : mongoose;
  const conn = _mongoose.connection;
  return _mongoose._promiseOrCallback(callback, cb => {
    conn.openUri(uri, options, err => {
      if (err != null) {
        return cb(err);
      }
      return cb(null, _mongoose);
    });
  });
};
//메인모듈
const mysql = require('mysql');
const pool = mysql.createPool({
  connectionLimit: 10,
  host: 'example.org',
  user: 'kundol',
  password: 'secret',
  database: '승철이디비',
});
pool.connect();
//모듈A
pool.query(query, function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});
//모듈B
pool.query(query, function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

싱글톤 패턴

class Singleton {
	private static class singleInstanceHolder {
		private static final Singleton INSTANCE = new Singleton();
	}

	public static Singleton getInstance() {
		return singleInstanceHolder.INSTANCE;
	}
}

public class HelloWorld {
	public static void main(String[] args) {
		Singleton a = Singleton.getInstance();
		Singleton b = Singleton.getInstance();
		System.out.println(a.hashCode());
		System.out.println(b.hashCode());
		if (a == b) {
			System.out.println(true);
		}
	}
}
/*
 * 705927765 705927765 true 1. 클래스안에 클래스(Holder), static이며 중첩된 클래스인
 * singleInstanceHolder를 기반으로 객체를 선언했기 때문에 한 번만 로드되므로 싱글톤 클래스의 인스턴스는 애플리케이션 당
 * 하나만 존재하며 클래스가 두 번 로드되지 않기 때문에 두 스레드가 동일한 JVM에서 2개의 인스턴스를 생성할 수 없습니다. 그렇기 때문에
 * 동기화, 즉 synchronized를 신경쓰지 않아도 됩니다. 2. final 키워드를 통해서 read only 즉, 다시 값이 할당되지
 * 않도록 했습니다. 3. 중첩클래스 Holder로 만들었기 때문에 싱글톤 클래스가 로드될 때 클래스가 메모리에 로드되지 않고 어떠한 모듈에서
 * getInstance()메서드가 호출할 때 싱글톤 객체를 최초로 생성 및 리턴하게 됩니다.
 */

0개의 댓글