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 組合起來 達到單例模式的效果!(這個也是快取代理的應用之一)