CoffeeScript 單件模式

2022-06-29 17:16 更新

單件模式

問題

許多時候你想要一個,并且只要一個類的實例。比如,你可能需要一個創(chuàng)建服務(wù)器資源的類,并且你想要保證使用一個對象就可以控制這些資源。但是使用時要小心,因為單件模式可以很容易被濫用來模擬不必要的全局變量。

解決方案

公有類只包含獲得一個實例的方法。實例被保存在該公共對象的閉包中,并且總是有返回值。

這很奏效因為CoffeeScript允許你在一個類的聲明中定義可執(zhí)行的狀態(tài)。但是,因為大多數(shù)CoffeeScript編譯成一個IIFE包,如果這個方式適合你,你就不需要在類的聲明中放置私有的類。之后的內(nèi)容可能對開發(fā)模塊化代碼有所幫助,例如CommonJS(Node.js)或Require.js中可見(見實例討論)。

class Singleton
  # You can add statements inside the class definition
  # which helps establish private scope (due to closures)
  # instance is defined as null to force correct scope
  instance = null
  # Create a private class that we can initialize however
  # defined inside this scope to force the use of the
  # singleton class.
  class PrivateClass
    constructor: (@message) ->
    echo: -> @message
  # This is a static method used to either retrieve the
  # instance or create a new one.
  @get: (message) ->
    instance ?= new PrivateClass(message)

a = Singleton.get "Hello A"
a.echo() # => "Hello A"

b = Singleton.get "Hello B"
b.echo() # => "Hello A"

Singleton.instance # => undefined
a.instance # => undefined
Singleton.PrivateClass # => undefined

討論

通過上面的實例我們可以看到,所有的實例是如何從同一個Singleton類的實例中輸出的。你也可以看到,私有類和實例變量都無法在Singleton class外被訪問到。 Singleton class的本質(zhì)是提供一個靜態(tài)方法得到只返回一個私有類的實例。它也對外界也隱藏私有類,因此你無法創(chuàng)建一個自己的私有類。

隱藏或使私有類在內(nèi)部運作的想法是更受偏愛的。尤其是由于缺省的CoffeeScript將編譯的代碼封裝在自己的IIFE(閉包)中,你可以定義類而無須擔(dān)心會被文件外部訪問到。在這個實例中,注意,用慣用的模塊導(dǎo)出特點來強調(diào)模塊中可被公共訪問的部分。(請看“導(dǎo)出到全局命名空間”中對此理解更深入的討論)。

root = exports ? this

# Create a private class that we can initialize however
# defined inside the wrapper scope.
class ProtectedClass
  constructor: (@message) ->
  echo: -> @message

class Singleton
  # You can add statements inside the class definition
  # which helps establish private scope (due to closures)
  # instance is defined as null to force correct scope
  instance = null
  # This is a static method used to either retrieve the
  # instance or create a new one.
  @get: (message) ->
    instance ?= new ProtectedClass(message)

# Export Singleton as a module
root.Singleton = Singleton

我們可以注意到coffeescript是如此簡單地實現(xiàn)這個設(shè)計模式。為了更好地參考和討論JavaScript的實現(xiàn),請看初學(xué)者必備 JavaScript 設(shè)計模式。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號