前言
实现语言JavaScript,以一个家庭为根本对象形象描述单例模式的一些用法。
单例模式之简约时尚
最简单的单例模式,简约时尚,可以说是非常时髦(可以偷懒)。
var DataHouse = {
dad: "jack",
mom: "lucy",
dog: "wangcai",
getDogName: function () {
return this.dog;
},
dogSay: function () {
return this.dog + ":wang wang wang!"
}
}
module.exports = DataHouse;
单例模式之隐私安全
啊,村头的王二狗跟jack有过节,jack不想让他知道老婆的名字,怎么办呢,我要隐藏起来,不给别人看到。可以用JavaScript的闭包解决,只返回需要暴露出来的名字。嘿嘿,王二狗可以骂jack,但是没办法直接骂Lucy,对此,Lucy感到很开心。
var DataHouseSafe = (function () {
var _dad = "jack";
var _mom = "lucy";
var _dog = "wangcai";
var _getDogName = function () {
return _dog;
};
var _dogSay = function () {
return _dog + ":wang wang wang!";
};
var publicObject = {
baba: _dad,
dog: _dog,
wangwang: _dogSay()
}
return publicObject;
})();
module.exports = DataHouseSafe;
单例模式之名誉安全
我去,王二狗给Jack起花名了。Jack很生气,也给王二狗又起了个花名。Jack决心不给王二狗再起花名,使用了JavaScript的对象属性冻结,维护了自己的名誉安全。
var DataHouseSafe = (function () {
var _dad = "jack";
var _mom = "lucy";
var _dog = "wangcai";
var _getDogName = function () {
return _dog;
};
var _dogSay = function () {
return _dog + ":wang wang wang!";
};
var publicObject = {
baba: _dad,
dog: _dog,
wangwang: _dogSay()
}
// 属性冻结
Object.freeze(publicObject);
return publicObject;
})();
module.exports = DataHouseSafe;
单例模式之懒汉模式
嘿,王二狗没办法骂人,心里憋着一口气,上门来找茬了。Jack决定放家里的旺财wangcai去看门,如果王二狗来了就把他唬回去。但是,总不能让旺财一直看门吧,Jack出门遛狗或者出去玩的时候可以不用看门,只要关键时候看门就好。Jack使用了懒汉模式解决了烦恼。
var DataHouseSafeLazy = (function () {
var _dad = "jack";
var _mom = "lucy";
var _dog = "wangcai";
var _getDogName = function () {
return _dog;
};
var _dogSay = function () {
return _dog + ":wang wang wang!";
};
var _instance = null;
function _watchDoor(comeIn) {
// 吠叫
function warning() {
return new DogWarning();
}
//摇尾巴
function wave() {
return new DogWave();
}
if (comeIn == "jack" || comeIn == "lucy") {
return wave;
} else {
return warning;
}
}
var publicObject = {
baba: _dad,
dog: _dog,
wangwang: _dogSay(),
watchHouse: function (comeIn) {
if (_instance == null) {
_instance = _watchDoor(comeIn);
}
return _instance;
},
}
Object.freeze(publicObject);
return publicObject;
})();
module.exports = DataHouseSafeLazy;