国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

設(shè)計模式: 從ES5 到 TypeScript ——單例模式

王軍 / 695人閱讀

摘要:現(xiàn)在讓我們設(shè)置溫度值并將其增加減少幾次小結(jié)在中,單例模式根據(jù)是否懶漢模式餓漢模式以及是否線程安全,分為很多種實現(xiàn)方式。參考設(shè)計模式與開發(fā)實踐設(shè)計模式

Back in 1994, a book was authored by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides that discusses 23 desgin patterns, titled Design Patterns: Elements of Resuable Object-Oriented Software. You may have heard of this book or the authors as Gang of Four (GoF).
單例模式

單例模式(Singleton Pattern)是最簡單的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型 (Creational) 模式,它提供了一種創(chuàng)建對象的最佳方式。

這種模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

注意:

單例類只能有一個實例。

單例類必須自己創(chuàng)建自己的唯一實例。

單例類必須給所有其他對象提供這一實例。

單例模式是一種常用的模式,有一些對象我們往往只需要一個,比如線程池、全局緩存、瀏覽器中的 window 對象等。在 JavaScript 開發(fā)中,單例模式的用途同樣非常廣泛。試想一下,當我們單擊登錄按鈕的時候,頁面中會出現(xiàn)一個登錄浮窗,而這個登錄浮窗是唯一的,無論單擊多少次登錄按鈕,這個浮窗都只會被創(chuàng)建一次,那么這個登錄浮窗就適合用單例模式來創(chuàng)建。

關(guān)鍵點

意圖:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

主要解決:一個全局使用的類頻繁地創(chuàng)建與銷毀。

何時使用:當您想控制實例數(shù)目,節(jié)省系統(tǒng)資源的時候。

如何解決:判斷系統(tǒng)是否已經(jīng)有這個單例,如果有則返回,如果沒有則創(chuàng)建。

關(guān)鍵代碼:構(gòu)造函數(shù)是私有的。

UML

我們將創(chuàng)建一個 SingleObject 類。SingleObject 類有它的私有構(gòu)造函數(shù)和本身的一個靜態(tài)實例。

SingleObject 類提供了一個靜態(tài)方法,供外界獲取它的靜態(tài)實例。SingletonPatternDemo,我們的演示類使用 SingleObject 類來獲取 SingleObject 對象。

ES5 面向?qū)ο?/b>

要實現(xiàn)一個標準的單例模式并不復雜,無非是用一個變量來標志當前是否已經(jīng)為某個類創(chuàng)建過對象,如果是,則在下一次獲取該類的實例時,直接返回之前創(chuàng)建的對象。代碼如下:

var Singleton = function(name) {
  this.name = name
}
Singleton.prototype.getName = function() {
  alert(this.name)
}
Singleton.getInstance = (function() {
  var instance = null
  return function(name) {
    if (!instance) {
      instance = new Singleton(name)
    }
    return instance
  }
})()

var a = Singleton.getInstance( "sven1" ); 
var b = Singleton.getInstance( "sven2" );
alert ( a === b ); // true

我們通過 Singleton.getInstance 來獲取 Singleton 類的唯一對象,這種方式相對簡單,但有 一個問題,就是增加了這個類的“不透明性”,Singleton 類的使用者必須知道這是一個單例類, 跟以往通過 new XXX 的方式來獲取對象不同,這里偏要使 Singleton.getInstance 來獲取對象。

上面單例模式的實現(xiàn),更多的是接近傳統(tǒng)面向?qū)ο笳Z言中的實現(xiàn),單例對象從 “類” 中創(chuàng)建而來。在以類為中心的語言中,這是很自然的做法。比如在 Java 中,如果需要某個對象,就必須先定義一個類,對象總是從類中創(chuàng)建而來的。

class-free

但 JavaScript 其實是一門無類(class-free)語言,也正因為如此,生搬單例模式的概念并無意義。在 JavaScript 中創(chuàng)建對象的方法非常簡單,既然我們只需要一個“唯一”的對象,為什 么要為它先創(chuàng)建一個“類” 呢?這無異于穿棉衣洗澡,傳統(tǒng)的單例模式實現(xiàn)在 JavaScript 中并 不適用。

1.使用命名空間

適當?shù)厥褂妹臻g,并不會杜絕全局變量,但可以減少全局變量的數(shù)量。 最簡單的方法依然是用對象字面量的方式:

var namespace1 = {
  a: function() {
    alert(1)
  },
  b: function() {
    alert(2)
  },
}

2.使用閉包封裝私有變量

這種方法把一些變量封裝在閉包的內(nèi)部,只暴露一些接口跟外界通信:

var namespace = {
  getSingleton: (function() {
    // BEGIN iife
    var singleton
    return function() {
      if (!singleton) {
        singleton = {
          amethod: function() {
            console.log("amethod")
          },
        }
      }
      return singleton
    }
  })(), // END iife
}
// Invoke: namespace.getSingleton().amethod()
ES6

ES6 里有了模塊和類的概念,實現(xiàn)起來會變得不一樣:

const singleton = Symbol();
const singletonEnforcer = Symbol();

class SingletonEnforcer {
  constructor(enforcer) {
    if (enforcer !== singletonEnforcer) {
      throw new Error("Cannot construct singleton");
    }

    this._type = "SingletonEnforcer";
  }

  static get instance() {
    if (!this[singleton]) {
      this[singleton] = new SingletonEnforcer(singletonEnforcer);
    }

    return this[singleton];
  }

  singletonMethod() {
    return "singletonMethod";
  }

  static staticMethod() {
    return "staticMethod";
  }

  get type() {
    return this._type;
  }

  set type(value) {
    this._type = value;
  }
}

export default SingletonEnforcer;
Typescript

TypeScript 中有了 private等概念,實現(xiàn)起來會更加有趣。

讓我們想象一下,我們想要一個跟蹤溫度的類。在這個系統(tǒng)中,我們希望有一個入口,可以改變溫度。這就是 Singleton類 的樣子:

class Singleton {
  private static instance: Singleton;
  private _temperature: number;
  private constructor() { }
  static getInstance() {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton();
      Singleton.instance._temperature = 0;
    }
    return Singleton.instance;
  }
  get temperature(): number {
    return this._temperature;
  }
  set temperature(score) {
    this._temperature = score;
  }
  increaseTemperature(): number {
    return this._temperature += 1;
  }
  decreaseTemperature(): number {
    return this._temperature -= 1;
  }
}

const myInstance = Singleton.getInstance();
console.log(myInstance.temperature); // 0

上面的實現(xiàn)有一下幾點需要注意:

構(gòu)造函數(shù) constructor 前面使用了 private 修飾:這意味著我們將無法使用 new 關(guān)鍵字實例化該類。

我們首先檢查我們是否有一個類的實例 instance,如果沒有,我們將創(chuàng)建并返回實例本身。

如果使用 new 關(guān)鍵字創(chuàng)建對象:

const myInstance = new Singleton(); // Constructor of class "Singleton" is private and only accessible within the class declaration.

根據(jù)上面的例子,我們也可以訪問 temperature 屬性。現(xiàn)在讓我們設(shè)置溫度值并將其增加/減少幾次:

console.log(myInstance.temperature = 25); // 25
console.log(myInstance.increaseTemperature()); // 26
console.log(myInstance.increaseTemperature()); // 27
console.log(myInstance.decreaseTemperature()); // 26
小結(jié)

在 java 中,單例模式根據(jù)是否 lazy loading (懶漢模式/餓漢模式)以及是否線程安全,分為很多種實現(xiàn)方式。而在 JS 中,我們不用關(guān)注線程安全的問題,因此無論是代碼復雜度還是實現(xiàn)難度都會低很多。

參考

es6-design-patterns

Singleton pattern in ES6

The Singleton pattern in JavaScript: not needed

JavaScript設(shè)計模式與開發(fā)實踐

設(shè)計模式

Singleton Pattern in TypeScript

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104971.html

相關(guān)文章

  • 前端常用技術(shù)概述--Less、typescript與webpack

    摘要:前言講起前端,我們就不能不講與,在這兩種技術(shù)廣泛應用的今天,他們的擴展也是層出不窮,的擴展有等,的超集有等。如下注意你的樣式文件一定要在引入前先引入。截止目前,已經(jīng)發(fā)布了最新的版本。 前言:講起前端,我們就不能不講CSS與Javascript,在這兩種技術(shù)廣泛應用的今天,他們的擴展也是層出不窮,css的擴展有Less、Sass、Stylus等,js的超集有Typescript等。今天我們就簡...

    番茄西紅柿 評論0 收藏0
  • vue + typescript 項目起手式

    摘要:新項目起手式最后更新于,技術(shù)文具有時效性,請知悉我知道你們早就想用上強類型了還有后續(xù)進階篇安裝安裝依賴配置添加添加讓識別改造文件什么是是的強類型版本。是的超集,這意味著他支持所有的語法。與此同時,也是的超集,的也宣布采用進行開發(fā)。 vue + typescript 新項目起手式 最后更新于2018-06-30,技術(shù)文具有時效性,請知悉 我知道你們早就想用上 vue + ts 強類型...

    zhisheng 評論0 收藏0
  • TS下的裝飾者模式(Decorator)

    摘要:裝飾者模式裝飾者模式就是動態(tài)的給類或?qū)ο笤黾庸δ艿脑O(shè)計模式。下的實現(xiàn)里的裝飾器目前處在建議征集的第二階段,不被瀏覽器所支持,如果想要提前使用這個新特性就需要,等工具進行轉(zhuǎn)譯。這里介紹下的用法。 1.1、裝飾者模式 裝飾者模式就是動態(tài)的給類或?qū)ο笤黾庸δ艿脑O(shè)計模式。在程序運行時動態(tài)的給一個具備基礎(chǔ)功能的類或?qū)ο筇砑有碌墓δ埽⑶也粫淖儠茐幕A(chǔ)類和對象的功能。先提煉出產(chǎn)品的最小可用產(chǎn)品...

    SolomonXie 評論0 收藏0
  • JavaScript => TypeScript 入門

    摘要:為了由簡入繁,不妨將這些類型劃分為基本類型復合類型。以下將漸進式的對的這些類型進行了解。實際上,有一種屬性描述對象,是通過獲取的。但無論如何,類型檢查是可以排除大部分錯誤的。在函數(shù)的類型聲明中,繼續(xù)來鞏固這條規(guī)則的寫法。 幾個月前把 ES6 的特性都過了一遍,收獲頗豐。現(xiàn)在繼續(xù)來看看 TypesScript(下文簡稱為 TS)。限于經(jīng)驗,本文一些總結(jié)如有不當,歡迎指正。 概述 官網(wǎng)有這...

    Tonny 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<