Singleton pattern

Kaydenna92·2022년 12월 10일
0

JavaScript

목록 보기
9/15

Singletons

  • 한 클래스에서 인스턴스를 한개만 생성하도록 제한하는 패턴
  • 인스턴스가 하나도 없는 경우에만 인스턴스를 만드는 메소드를 포함하여 클래스를 생성하는 방법으로 적용할 수 있다.
  • 이미 인스턴스가 존재한다면, 함수는 그 인스턴스의 reference를 리턴하도록 한다.

singletons 패턴이 필요한 때는 아래와 같은 상황이다.

let userModule = (function () {
  let users = [];
  let userId = 0;
  return {
    create: (username, password) => {
      let user = { id: userId, username, password };
      users.push(user);
      userId++;
      return user;
    },
    get: (username) => {
      let targetUser;
      users.forEach((user) => {
        if (user.username === username) {
          targetUser = user;
        }
      });
      return targetUser;
    }
  };
})();
console.log(userModule.create('Julia', 'hello123'));
console.log(userModule.create('Julia', 'hello123'));
console.log(userModule.create('Julia', 'hello123'));
console.log(userModule.create('Paul', 'hello456'));

  • username이 'Julia'인 데이터는 하나만 있어야 하는데, 위 코드를 실행하면 Julia 데이터가 이미 있음에도 불구하고 계속 새로 생성한다.
let userModule = (function () {
  let userAddress = {};
  let users = [];
  let userId = 0;
  return {
    create: (username, password) => {
      if (!userAddress.hasOwnProperty(username)) {
        let user = { id: userId, username, password };
        userAddress[username] = users.length + '';
        users.push(user);
        userId++;
        return user;
      } else {
        return users[userAddress[username]];
      }
    },
    get: (username) => {
      return (userAddress[username]) ? users[userAddress[username]] : null;
    }
  };
})();
console.log(userModule.create('Julia', 'hello123'));
console.log(userModule.create('Julia', 'hello123'));
console.log(userModule.create('Julia', 'hello123'));
console.log(userModule.create('Paul', 'hello456'));
console.log(userModule.get('Julia'));
console.log(userModule.get('Paul'));
console.log(userModule.get('Mike'));


코드를 살짝 바꾸면 원하는 결과가 나온다.
아래 코드는 singleton을 적용해 본 다른 예제.

let mySingleton = (function () {
  let instance;
  function init () {
    function privateMethod () {
      console.log("I'm private");
    }
    let privateVariable = "I'm also private";
    let privateRandomNumber = Math.random();
    return {
      publicMethod: function () {
        console.log('The public can see me!');
      },
      publicProperty: "I'm also public",
      getRandomNumber: function () {
        return privateRandomNumber;
      }
    }
  }
  return {
    getInstance: function () {
      if (!instance) {
        instance = init();
      }
      return instance;
    }
  }
})();
let singleA = mySingleton.getInstance();
let singleB = mySingleton.getInstance();

위와 같이 mySingleton이 리턴하는 객체의 getInstance 메서드는 instance 변수에 아무것도 할당되지 않았을 대는 init 함수를 실행하여 리턴되는 객체를 instance 변수에 할당하고, 만약에 이미 instance 변수에 객체가 할당되어 있다면 할당되어있는 인스턴스 변수의 값을 리턴한다.

profile
persistently

0개의 댓글