單例模式
單例表示只存在一個這樣的對象。單例模式是一種非常重要的設(shè)計模式蛹尝,有很多經(jīng)典的應(yīng)用場景后豫,比如說,網(wǎng)站的登錄用戶對象應(yīng)當是單例的突那,用戶在登錄過程中挫酿,不應(yīng)該創(chuàng)建兩個相同的用戶對象。
IIFE實現(xiàn)
單例模式最簡單的實現(xiàn)方案就是全局變量愕难,不用通過函數(shù)調(diào)用來返回對象早龟,不用構(gòu)造器來生成對象,這樣的對象天生就是單例猫缭。更好的方法是葱弟,我們用函數(shù)來生成單例。
function User(name){
return {name:name}
}
我們首先創(chuàng)建一個返回用戶對象的函數(shù)猜丹,這個函數(shù)并不能保證單例芝加,因為每次調(diào)用這個函數(shù)返回的對象都是不同的。
var singleUser = (function(){
var result;
return function(name){
return result || (result = {name:name})
}
})();
console.log(singleUser("tom").name) //tom
console.log(singleUser("jack").name) //tom
這里我們使用了IIFE來實現(xiàn)了單例模式居触,我們在IIFE中設(shè)置了result變量妖混,并返回一個可以引用到result變量的函數(shù),當?shù)谝淮蝿?chuàng)建單例時轮洋,result被初始化制市,之后如果又試圖創(chuàng)建的時候,直接返回result弊予。這樣就能夠成功的保證單例
正交化設(shè)計
var makeSingle = function(constructor){
var result;
return {
create: function(){
return result || (result = constructor.apply(this,arguments));
}
}
}