2014-09-14 13 views
6

Tôi sử dụng lớp mẫu đơn trong coffeescript được hiển thị bên dưới gần đây. Nó hoạt động hoàn hảo nhưng tôi không biết tại sao điều này có thể là một mẫu đơn. Đây có thể là một câu hỏi ngu ngốc nhưng cảm ơn bạn đã trả lời.Lớp Singleton trong 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" 

và mã dưới đây là javascript được sản xuất bởi các mã trên

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); 

EDITED: Tôi không yêu cầu định nghĩa của 'Singleton pattern' cũng không làm thế nào họ thường được tạo ra nhưng lý do tại sao mã ở trên luôn trả về cùng một cá thể thay vì tạo một mã mới.

+0

Bạn có thể xem xét việc chạy mã này trong trình gỡ lỗi, để xem 'lý do' hoặc 'cách' mã này thực hiện những gì nó làm. –

Trả lời

9

Trước hết, có một 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) 

Bạn cố gắng làm một điều tương tự, nhưng sai lầm với CoffeeScript cú pháp một chút. Dưới đây là cách hiển thị:

class BaseClass 
    class Singleton 

    singleton = new Singleton() 

    constructor: -> 
    return singleton 

Lưu ý rằng tôi đang sử dụng rõ ràng return tại đây. Tôi đang làm điều đó vì sự trở lại ngầm của CoffeeScript không làm việc cho các nhà xây dựng lớp.

Tôi cũng khuyên bạn nên xem qua câu hỏi Simplest/Cleanest way to implement singleton in JavaScrip.

thực hiện singleton ưa thích của tôi là một trong những sau:

class BaseClass 
    instance = null 

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

Nó hoạt động như của bạn ngoại trừ hai điều:

  • nó không đòi hỏi một định nghĩa lớp bổ sung;
  • nó tạo ra cá thể singleton đầu tiên chỉ khi cần thiết.
+0

Hoàn hảo !! Đây chính là điều tôi muốn biết. Cám ơn. – suish

0

Từ Wikipedia,

Các Singleton pattern là một mẫu thiết kế mà hạn chế instantiation của một lớp học để một đối tượng

Vì trong ví dụ của bạn, một sự thay đổi trong a được phản ánh trong b, nó cho thấy rằng chúng là cùng một đối tượng, do đó đây là Mẫu Singleton.

Bạn có thể sử dụng tùy chọn này nếu chỉ được coi là một cá thể đơn lẻ trên một trang, chẳng hạn như điều khiển AJAX. Trong JavaScript, bạn không thể ngăn ai đó gọi chức năng của mình bằng "mới", như trong var b = new BaseClass(), nhưng bạn có thể đảm bảo rằng chỉ một cá thể đơn lẻ được trả về bằng cách sử dụng mẫu này.

+0

Tôi không hỏi định nghĩa về 'mẫu đơn' nhưng lý do tại sao mã trong câu hỏi có thể là singleton. – suish

+0

Tôi đã giải thích những gì singleton là, và tại sao mã của bạn là singleton, và tại sao bạn có thể chọn singleton. Nếu bạn đang tìm kiếm nhiều hơn, có thể câu hỏi của bạn cần phản ánh những gì bạn cần. –

-1

Bạn chỉ cần khai báo biến số instance chỉ được sử dụng để chứa cá thể của bạn.

Singleton = -> 
    self   = this 

    self.foo = -> 
     # stuff here 

    self 

    module.exports = @instance ?= new Singleton() 
Các vấn đề liên quan