2016-09-23 1 views
-2

저는 JS에서 초보자입니다. 그래서 맨손으로 보았습니다. 구현 방법을 이해하는 것이 매우 까다 롭습니다. 그리고 어떤 사람들은 대부분 피할 것을 제안합니다. 아래는 특정 싱글 톤입니다. 내가 이해하기 쉬운 것을 발견하는 변이, 그러나 여하튼 나는 이것이이 패턴의 가장 좋은 구현이 아니라고 느낀다, 너희들은이 패턴의 더 좋은 형태를 제안 할 수 있겠 니?다음 싱글 톤 패턴에 문제가 있습니까?

var Foo = (function() { 
 
    
 
    var instance; 
 
    var _priVar = 2; 
 
    var log = function() { 
 
     console.log("Hello"); 
 
    }; 
 
    
 
    function Singleton(x, y) { 
 
     if (instance) { 
 
      return instance; 
 
     } 
 
     
 
     this.name = x; 
 
     this.age = y + _priVar; 
 
     this.log = log; 
 
     
 
     instance = this; 
 
    } 
 
    Singleton.getInstance = function() { 
 
     return instance || new Singleton(); 
 
    } 
 
    return Singleton; 
 
}());
내 목표는 우리가

var a = new Foo("Bob", 24); var b = new Foo(); var c = Foo(); var d = Foo.getInstance();

를 다음 작업을 수행 할 때 우리는 여전히 얻을 것입니다

a == b // true 
a == c // true 
a == d // true 
a.name // 'Bob' 
b.age // 26 
c.log // 'Hello' 
d.name // 'Bob' 

감사합니다,

+0

원하는대로, 코드가 잘 작동합니다. – passion

+0

'우리는 여전히 얻을 것입니다. '- 당신은 그것을 얻습니다 - 무엇이 문제입니까? –

+0

무엇보다도 싱글 톤 패턴 자체에 문제가 있습니다. (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) 특정 구현은 이러한 문제를 상속합니다. – Bergi

답변

1

또한 모듈 패턴으로 알려진 간단한 싱글은, 객체 리터럴 구성 : 당신이 게으른 초기화를 소개합니다

var foo = (function() { 
    var x = "Bob", 
     y = 24, 
     _priVar = 2; 

    function log() { 
     console.log("Hello"); 
    } 

    return { 
     name: x, 
     age: y + _priVar, 
     log: log 
    }; 
}()); 

, 당신처럼 추가 getInstance 기능을 사용할 수 있습니다 구현 :

var getFoo = (function() { 
    var instance = null; 
    return function getFooInstance() { 
     if (instance) return instance; 

     var x = "Bob", 
      y = 24, 
      _priVar = 2; 

     function log() { 
      console.log("Hello"); 
     } 

     return instance = { 
      name: x, 
      age: y + _priVar, 
      log: log 
     }; 
    }; 
}()); 

싱글 톤은 코드 에서처럼 생성자를 사용해서는 안됩니다. 단지 불필요합니다. 초기화를위한 인수를 전달해야한다고 생각하면 은 싱글 톤이되지 않습니다.

+0

마지막 줄에 조언 해 주셔서 감사합니다. 왜 우리가 싱글 톤으로 생성자를 사용하지 말아야하는지 설명 할 수 있습니까? '불필요한'이외의 다른 이유가 있습니까? – xcode

+0

비어있는 쓸데없는 프로토 타입을 생성합니다.'new'가 없으면 부주의하게 호출 될 수 있습니다. 그것은 지나치게 복잡합니다. 간단한 공장 기능으로 이동하십시오. – Bergi