2014-09-14 2 views
6

최근에 아래에 표시된 coffeescript에서 싱글 톤 패턴 클래스를 사용합니다. 완벽하게 작동하지만 왜 이것이 싱글 톤 패턴이 될 수 있는지 알 수 없습니다. 이것은 바보 같은 질문 일 수도 있지만 답변 해 주셔서 감사합니다.coffeescript의 싱글 톤 클래스

#coffeescript 
class BaseClass 
    class Singleton 

    singleton = new Singleton() 
    BaseClass = -> singleton 

a = new BaseClass() 
a.name = "John" 
console.log a.name # "John" 
b = new BaseClass() 
b.name = "Lisa" 
console.log b.name # "Lisa" 
console.log a.name # "Lisa" 

아래 코드는

var BaseClass, a, b; 

BaseClass = (function() { 
    var Singleton, singleton; 

    function BaseClass() {} 

    Singleton = (function() { 
    function Singleton() {} 

    return Singleton; 

    })(); 

    singleton = new Singleton(); 

    BaseClass = function() { 
    return singleton; 
    }; 

    return BaseClass; 

})(); 

a = new BaseClass(); 

a.name = "John"; 

console.log(a.name); 

b = new BaseClass(); 

b.name = "Lisa"; 

console.log(b.name); 

console.log(a.name); 

편집

위의 코드에 의해 생성되는 자바 스크립트입니다 : 나는 '싱글 톤 패턴'도 어떻게 일반적으로 생성되지만의 정의를 요구 하진 않았어 위의 코드가 항상 새로운 인스턴스를 만드는 대신 동일한 인스턴스를 반환하는 이유.

+0

디버거에서이 코드를 실행하면 '왜'또는 '어떻게'이 코드가 무엇을하는지 볼 수 있습니다. –

답변

9

우선은 good example of Singleton Pattern implementation in CoffeeScript Cookbook가 :

class Singleton 
    instance = null 

    class PrivateClass 
    constructor: (@message) -> 
    echo: -> @message 

    @get: (message) -> 
    instance ?= new PrivateClass(message) 

당신은 비슷한 일을하려고했으나 커피 스크립트로 엉망이 조금 구문. 다음과 같이 표시됩니다.

class BaseClass 
    class Singleton 

    singleton = new Singleton() 

    constructor: -> 
    return singleton 

여기서는 명시적인 return을 사용하고 있습니다. CoffeeScript 암시 적 반환이 클래스 생성자에서 작동하지 않기 때문에이 작업을 수행하고 있습니다.

Simplest/Cleanest way to implement singleton in JavaScrip 질문을 살펴 보시기 바랍니다.

내가 가장 좋아하는 싱글 톤 구현은 다음 중 하나입니다 :

class BaseClass 
    instance = null 

    constructor: -> 
    if instance 
     return instance 
    else 
     instance = this 
    # contructor code 

이 두 가지를 제외하고 당신처럼 작동 :

  • 그것을 추가 클래스 정의를 필요로하지 않는다;
  • 필요할 때만 첫 번째 싱글 톤 인스턴스를 만듭니다.
+0

완벽한 !! 이것은 내가 알고 싶었던 바로 그 것이다. 고마워. – suish

0

,

싱글 톤 패턴이 예에 있기 때문에 하나의 객체

에 클래스의 인스턴스를 제한하는 디자인 패턴이다 a의 변화가 반영된다 b에서, 그것들은 동일한 객체라는 것을 보여 주므로, 이것은 싱글 톤 패턴이다.

AJAX 컨트롤과 같이 페이지에 인스턴스가 하나만 있다고 가정 할 때 사용할 수 있습니다. JavaScript에서는 var b = new BaseClass()처럼 "new"를 사용하여 함수를 호출하지 못하게 할 수는 있지만이 패턴을 사용하여 단일 인스턴스 만 반환되도록 할 수 있습니다.

+0

'싱글 톤 패턴'의 정의를 묻지는 않지만 질문의 코드가 싱글 톤일 수있는 이유는 무엇입니까? – suish

+0

나는 싱글 톤이 무엇인지, 왜 싱글 톤인지, 왜 싱글 톤을 선택할지를 설명했다. 더 많은 것을 찾고 있다면 어쩌면 당신의 질문이 당신이 필요로하는 것을 반영 할 필요가있을 것입니다. –

-1

인스턴스를 포함하기 위해서만 사용되는 instance 변수를 선언하면됩니다.

Singleton = -> 
    self   = this 

    self.foo = -> 
     # stuff here 

    self 

    module.exports = @instance ?= new Singleton()