JS 設計模式之初識(一)-單例模式

1、定義

設計模式的定義是:在面向對象軟件設計過程當中針對特定問題的簡潔而優雅的解決 方案,通俗一點說,設計模式是在某種場合下對某個問題的一種解決方案。若是再通俗一點說,設計模式就是給面向對象軟件開發中的一些好的設計取個名字。也就是說設計模式並不難,而只是一些目前公認的解決某些問題的最佳實現而已。設計模式

1. 單例模式

單例模式的定義是:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。例如:線程池,全局緩存,瀏覽器window對象等,這些都只須要一個對象實例就足夠了。瀏覽器

1.1 實現單例模式

要實現單例模式也並不複雜,只要用一個變量來標識是否已經給某個類建立過實例,若是是,則在下一次獲取該類的實例的時候,直接返回已經緩存好的實例, 不然建立並緩存這個實例。緩存

1.單例模式實現一bash

// 單例模式實現一
    function SingleTon(name) {
        this.name = name;
        this.instance = null;
    }
    SingleTon.prototype.getName = function() {
        return this.name;
    }
    SingleTon.getInstance = function(name) {
        if (this.instance) {
            return this.instance;
        }
        return new SingleTon(name);
    }
複製代碼
  1. 單例模式實現二, 利用閉包
// 單例模式實現二, 利用閉包
    function SingleTon2(name) {
        this.name = name;
    }
    SingleTon2.getInstance = (function(){
        let instance = null;
        return function(name) {
            if (!instance) {
                instance = new SingleTon2(name);
            }
            return instance;
        }
    })();
複製代碼
  1. 實現三, 利用類
// 實現三 類
    class SingleTon3 {
        constructor(props) {
            const { name, ...other } = props;
            this.name = name;
            this.instance = null; // 標識是否已經建立過實例
        }
        setName = () => {
            return this.name;
        }
        static getInstance = (name) => {
            this.instance = this.instance ? this.instance : new SingleTon3(name); 
            return this.instance;
        }
    }

    const t1 = SingleTon3.getInstance('timo1');
    const t2 = SingleTon3.getInstance('timo2');
    console.log('t1 => ',t1); // timo1
    console.log('t2 => ',t2); // timo1
    console.log('t1 === t2 => ',t1 === t2); // true
複製代碼

注意: 類(class)經過static關鍵字定義靜態方法。不能在類的實例上調用靜態方法,而應該經過類自己調用。這些一般是實用程序方法,例如建立或克隆對象的功能閉包

4.衍生, 使用閉包來封裝私有變量ui

// 使用閉包來封裝私有變量
    const user = (function() {
        let name = 'timo';
        let age = 22;
        return {
            getUserInfo: function() {
                return name + ' '+ age;
            }
        };
    })();
複製代碼

特別注意:let 和 const 聲明並不會綁定到全局的window對象上!!!而使用var聲明會自動綁定到windowthis

總結:

單例模式是一種簡單但很是實用的模式,特別是惰性單例技術,在合適的時候才建立對象,而且只建立惟一的一個。spa

相關文章
相關標籤/搜索