2014-09-14 2 views
6

Я использую класс singleton pattern в coffeescript, который показан ниже в последнее время. Он работает отлично, но я не знаю, почему это может быть одноэлементный шаблон. Это может быть глупый вопрос, но спасибо за ваш ответ.Singleton class in 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" 

и код ниже Javascript, который производится с помощью кода выше

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) 

Вы пытались сделать нечто подобное, но запутались с CoffeeScript синтаксис немного. Вот как это должно выглядеть:

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 

Он работает, как у вас за исключением двух вещей:

  • он не требует дополнительного определения класса;
  • создает первый экземпляр singleton только тогда, когда это необходимо.
+0

Perfect !! Это именно то, что я хотел знать. Спасибо. – suish

0

От Wikipedia,

Одноэлементный шаблон является шаблон дизайна, который ограничивает создание экземпляра класса к одному объекту

Так как в вашем примере, изменение в a отражается в b, это показывает, что они являются одним и тем же объектом, таким образом, это шаблон Singleton.

Вы можете использовать это, если только предполагается, что на странице есть только один экземпляр, например элемент управления AJAX. В JavaScript вы не можете запретить кому-либо вызывать вашу функцию с «новым», как в var b = new BaseClass(), но вы можете гарантировать, что только один экземпляр когда-либо возвращается с использованием этого шаблона.

+0

Я не прошу определения «singleton pattern», но причина, по которой код в вопросе может быть одноточечным. – suish

+0

Я объяснил, что такое синглтон, и почему ваш код был singleton, и почему вы можете выбрать singleton. Если вы ищете больше, возможно, ваш вопрос должен отражать то, что вам нужно. –

-1

Вам просто нужно объявить переменную instance, которая используется только для хранения вашего экземпляра.

Singleton = -> 
    self   = this 

    self.foo = -> 
     # stuff here 

    self 

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