1. 程式人生 > 其它 >STM32CubeMX 定時器配置時鐘中的auto-reload precload

STM32CubeMX 定時器配置時鐘中的auto-reload precload

單例模式:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點!

例如 有些物件我們往往只需要一個,比如執行緒池、全域性快取、瀏覽器中的window物件、jq物件等。我們在登入的時候登入的浮窗,無論我們點了多少次登入 浮窗只會被建立一次 這個浮窗我們就可以用單列模式來建立。
1.簡單實現下單例模式
思路:用一個類建立物件,如果下次再次使用該類的例項物件的時候,直接返回之前的物件,,要通過一個變數來記錄是否為某類建立過物件

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

var b = a.getInstance('zhangsan')
var c = a.getInstance('lisi')
alert(b=== c)  //?     true

2.‘透明’的單例模式
目標:實現一個‘透明’的單例類。從這個類中建立物件的時候,可以像使用其他任何普通類一樣
需求:在頁面上中建立衛衣的div節點,藉助單例模式的思想

var CreateDiv = (function(){
	var instance;
	var CreateDiv = function(html){
		if(instance){
			return instance
		}
		this.html = html
		this.init()
		return instance = this
	}
	CreateDiv.prototype.init = function (){
		var div = document.CreateElement('div')
		div.innerHTML = this.html
		document.body.appendChild(div)
	}
	
	return CreateDiv
})
var a = new CreateDiv('zhangsan')
var b = new CreateDiv('lisi')

elert(a===b)  //?       true

簡單實現了上面的需求跟目標,看程式碼能發現一些缺點

//現在的Singleton建構函式
var CreateDiv = function(html){
	if(instance){
		return instance
	}
	this.html = html
	this.init()
	return instance = this
}

為了把instance封裝起來,我們使用了自執行函式的匿名函式和閉包 並且讓這個匿名函式返回真正的Singleton建構函式, 在一定程度上增加了 程式的複雜程度 不易閱讀
CreateDiv 的建構函式主要負責了兩件事 1、建立物件和執行初始化函式 2.保證只有一個物件例項。假如 有一天我們利用這個類建立千千萬萬個DIV,即要讓這個類 從單例類 變成 一個普通的 可以建立多個例項的類,那我們必須要改寫CreateDiv 建構函式,去掉控制建立唯一物件的那一層去掉,這種修改也會給我們帶來別的麻煩。
3.用代理實現單例模式
引入代理類的概念,主要是解決上面提到的問題。
通過2後面提出的問題 對CreateDiv 建構函式進行改造 把單例的程式碼移除 是它成為一個普通的建立DIV的類;

var CreateDiv = function(html){
	this.html = html
	this.init()
	return instance = this
}
CreateDiv.prototype.init = function (){
	var div = document.CreateElement('div')
	div.innerHTML = this.html
	document.body.appendChild(div)
}

接著引入代理類 PrototypeCreateDiv

var PrototypeCreateDiv = (function(){
	var instance;
	return functon( html ){
		if( !instance ) {
			instance = new CreateDiv( html );
		}
		return instance
	}
})();
var a = new PrototypeCreateDiv('zhangsan')
var b = new PrototypeCreateDiv('lisi')
alert(a===b) //?     true

引入代理類的方式 ,我們同樣也完成了一個單例模式的編寫,跟之前不同的是 現在我們把負責管理單例的邏輯 移到了 代理類 PrototypeCreateDiv 中。CreateDiv的也變成了一個普通的類,它與PrototypeCreateDiv 組合起來 達到單例模式的效果!(這個也是快取代理的應用之一)