2012-04-13 4 views
6

확장하고 싶은 싱글 톤 클래스를 만들었습니다. 그것 (절반)은 클래스의 단일 인스턴스 만 생성한다는 점에서 작동하지만 서브 클래스에 추가 된 속성은 정의되지 않습니다. 나는 내 노드 응용 프로그램에서 다음을 사용하는 경우 이제coffeescript 싱글 톤 하위 클래스 생성 방법

Singleton = require('./singleton') 

class Stinky extends Singleton 
     constructor: -> 
     var1 : 'var1' 


module.exports = Stinky 

:

Stinky = require './stinky' 
thing1 = Stinky.getInstance() 
thing2 = Stinky.getInstance() 
console.log "Thing var1: #{thing1.var1}" 

getInstance() 메소드는 동작 여기

class Singleton 
    _instance = undefined 
    @getInstance: -> 
     if _instance is undefined 
     console.log 'no instance exists, so create one' 
     _instance = new _Singleton() 
     else 
     console.log 'an instance already exists.' 

class _Singleton 
    constructor: -> 
     console.log 'new singelton' 

module.exports = Singleton 

그리고 서브 클래스 : 여기에 원래 싱글입니다 예상대로 var1은 정의되지 않았습니다. 내가 싱글 톤이 아닌 클래스에서 똑같은 일을한다면 잘 작동합니다. 감사.

+1

'var1 :'var1 '은 오타가 있습니까? 'var1 ='var1 '또는 실제로는 @ var1 ='var1 '이어야합니까? – Sandro

답변

2

_Singleton 클래스를 사용하여 개인 클래스를 시뮬레이트하는 방법을 확인했지만, 불행히도이 경우에는 사용할 수 없다고 생각합니다. 여기

작동하는 코드입니다 :
class Singleton 
    _instance = undefined 

    constructor: -> 
     console.log 'new singleton' 

    @getInstance: -> 
     if _instance is undefined 
     console.log 'no instance exists, so create one' 
     _instance = new @() 
     else 
     console.log 'an instance already exists.' 
     _instance 

class Stinky extends Singleton 
     constructor: -> 
     console.log 'Stinky constructor' 
     @var1 = 'var1' 


thing1 = Stinky.getInstance() 
thing2 = Stinky.getInstance() 

console.log "Thing var1: #{thing1.var1}"​​​​​​​​​​​​​​​​​​, thing1, thing2​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

내가 Node.js를이 (필요) 코드를 제거하지만, 그의를 추가하는 것은 간단합니다. 가장 큰 차이점은 내 코드가 생성하는 인스턴스가 @ 또는 this의 인스턴스라는 것입니다. 이렇게하면 생성자가 먼저 호출 된 다음 상위 체인까지 계속 진행됩니다. 귀하의 코드가 명시 적으로 _Singleton의 인스턴스를 생성하여 Stinky 생성자가 호출되지 않았습니다. 궁극적으로 발견 한 또 다른 사소한 문제는 getInstance 메서드가 실제로 _instance의 인스턴스를 반환하지 않는다는 것입니다. 난이 도움이되기를 바랍니다

,

산드로

+0

감사합니다. Sandro. 그것에게 강타를 줄 것이다. –

12

나는 조금 아래 코드를 손질. 다음은이 나머지 클래스는 다음과 같습니다

  • 는 싱글 및 _Singleton
  • 변경된 _instance 그것이 프로토 타입보다는 싱글에 부착 될 수 있도록 @_instance하기를 합병 :

    class Singleton 
        @_instance: null 
        @getInstance: -> 
        @_instance or= new @(arguments...) 
    
    class Stinky extends Singleton 
        constructor: (@num) -> 
    
    thing1 = Stinky.getInstance(1) 
    thing2 = Stinky.getInstance(2) 
    
    console.log(thing1.num, thing2.num) 
    

    나는 다음과 같이 변경했다

  • 인수가 필요한 경우를 위해 getInstance에 splat를 추가했습니다.
  • gettonstore()를 Singleton이 아닌 확장 객체에 지정

이 예제에서는 두 번째 생성자가 호출되지 않도록 두 개의 숫자를 사용했습니다.

1

나는 목적이 무엇인지 모르겠지만, 당신은 진정한 싱글 (일반 객체) Singleton함으로써 동일한 결과를 얻을 수 있습니다 : 그것은에 Singleton 훨씬 이해가되지 않습니다

Singleton = 
    doNothing: -> 
     # ... 
    doMoreNothing: -> 
     # ... 

class Stinky 
    constructor: -> 
     @var1: 'var1' 
    getInstance: -> 
     return Singleton 

을 자체를 반환하는 메서드가 있습니다.

+0

실제 Coffeescript (및 Javascript) 스타일에 대한 정답입니다. Javascript는 프로토 타입 기반 언어이므로 Singleton과 같은 일반적인 OOP 디자인 패턴은 이해가되지 않습니다. – Vortico

+0

@Vortico 나는 동의하지 않는다. CoffeeScript가'class' 키워드를 가지고 있다는 사실은 더 친숙한 클래스 기반 상속 모델을 에뮬레이트하는 것을 목표로한다는 것을 알려줍니다. 커뮤니티에서 관리하는 CoffeeScript Cookbook에는 [Singleton 패턴에 대한 페이지] (http://coffeescriptcookbook.com/chapters/design_patterns/singleton)도 있습니다. 슬프게도이 페이지는 상속을 언급하지 않습니다. :( –