1. 程式人生 > 其它 >《JavaScript設計模式》章5--單體模式

《JavaScript設計模式》章5--單體模式

單體的基本結構

好氣,之前寫了好久的東西由於公司停電全沒了,這篇全部是重寫的。。。就當溫故知新了吧...

var Singleton = {
  attribute1: true,
  attribute2: 10,
  method1: function() {...},
  method2: function(arg) {...}
}

劃分名稱空間

var nameSpace = {
  findProduct: function() {...}
}
//這裡的findProduct不會覆蓋前面的,因為前面的是通過nameSpace.findProduct()進行訪問
var findProduct = 1

擁有私有成員的單體

使用下劃線表示私有

這種形式的私有性完全靠自覺

var mySingle = {
  //公有成員
  attribute_one: 1,
  //私有成員,下劃線開頭
  _attribute_two: true
}

使用閉包實現私有

基本思路就是使用立即執行函式來返回一個物件字面量

var mySingle = (function() {
  //這裡定義的成員是私有的
  var attribute_me = false
  //方法也可以私有
  function_me: function() {...}
  return {
  //公共成員可以在這裡暴露出去
  attribute_pub: 1,
  //可以暴露出操作私有成員的公共方法例如setName, getName等
  ...
  }
})()

惰性例項化單體

思路:把前面立即執行的函式中的邏輯封裝成一個建構函式,然後返回一個公用的例項化方法來呼叫建構函式

//這裡使用dx來代表“惰性”...
var mySingle_dx = (function() {
  constructor: functionn() {
    //之前的程式碼,就是相當於把直接的return轉換成呼叫constructor()才返回
    ...
  }
  //將例項化的方法暴露出去
  return {
    getInstance: function() {
      return constructor()
    }
  }
})()

真正的體現“單體”

我們在前面程式碼的基礎上需要做到: 未例項化返回新例項,否則返回已有例項

//這裡使用dx來代表“惰性”...
var mySingle_dx = (function() {
  constructor: functionn() {
    //之前的程式碼,就是相當於把直接的return轉換成呼叫constructor()才返回
    ...
  }
  //在這裡新增一個私有屬性來標記是否已經被例項化
  var uniqueInstance;
  //將例項化的方法暴露出去
  return {
    getInstance: function() {
      //根絕例項化的情況作出不同的處理
      if(!uniqueInstance) {
        uniqueInstance = constructor()
      }
      return uniqueInstance;
    }
  }
})()

分支

思路: 在我們前面之間返回一個物件的思路基礎上,根據業務條件宣告好多個(類似的)物件字面量,但最終只返回其中滿足條件的一個

var mySingle_branch = (function() {
  var objA = {
   //定義屬性和方法
  }
  var objB =  {
    //定義屬性和方法
  }
  return (someConditions) ? objA : objB
})()