設計模式的定義是:在面向對象軟件設計過程當中針對特定問題的簡潔而優雅的解決 方案,通俗一點說,設計模式是在某種場合下對某個問題的一種解決方案。若是再通俗一點說,設計模式就是給面向對象軟件開發中的一些好的設計取個名字。也就是說設計模式並不難,而只是一些目前公認的解決某些問題的最佳實現而已。設計模式
單例模式的定義是:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。例如:線程池,全局緩存,瀏覽器window對象等,這些都只須要一個對象實例就足夠了。瀏覽器
要實現單例模式也並不複雜,只要用一個變量來標識是否已經給某個類建立過實例,若是是,則在下一次獲取該類的實例的時候,直接返回已經緩存好的實例, 不然建立並緩存這個實例。緩存
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);
}
複製代碼
// 單例模式實現二, 利用閉包
function SingleTon2(name) {
this.name = name;
}
SingleTon2.getInstance = (function(){
let instance = null;
return function(name) {
if (!instance) {
instance = new SingleTon2(name);
}
return instance;
}
})();
複製代碼
// 實現三 類
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