單例模式應該是最簡單的一種設計模式,但是面試官提到的時候,還是不能準確的回答出來,原因還是概念不清晰。
關鍵詞:對象,唯一接口
依然從下面這幾個問題入手:
1、它的定義
2、它的出現解決了什么問題
3、怎么用,應用場景
4、優缺點或者局限性
單例模式的本質:
把描述同一事物(同一個對象)的屬性和方法放在一個內存空間下,起到了分組的作用,這樣不同事物之間的屬性即使屬性名相同,相互也不會沖突。這種分組編寫代碼的模式叫做“單例模式”。
首先,它是一個對象;其次,為全局空間提供了唯一的訪問點來訪問該對象
怎么用
下面是一個最簡單的例子:
var a={
b:function () {
},
c:function () {
this.b();
}
}
模塊間互相調用,可以使用對象名.屬性名來調用。
模塊內部互相調用,使用this.xxx,使用this的好處是,在代碼合并時,如果對象名a和別人的代碼出現沖突,只需要更改對象名就行了,this永遠指向這個對象名。
稍微復雜點的:
var model1=(function () {
function b() {
console.log(1);
}
function c() {
console.log(2);
}
return{
init:function () {
b();
c();
}
}
}())
model1.init();
var model2=(function () {
function b() {
console.log(1);
}
function c() {
console.log(2);
}
return{
init:function () {
b();
c();
model1.init();
}
}
}());
model2.init();
老司機看到這種代碼,估計會呵呵了。
萬變不離其宗,它依然是一個對象,提供了唯一的訪問接口
這是開發過程中最常用的一種開發模式
優缺點:
優點:
代碼直觀,如果出錯,很容易能找到。
缺點:
擴展性不好,對一個單例中的方法重寫,會破壞原有的需求。a.c=function(){console.log(100)},這樣結果就完全變了。
靈活性不好,當某個需要該功能的需求變動時,而其他的又不變動,那么單例模式就不好處理了。
不同的對象下,會有很多功能相同的代碼,最終造成大量冗余的代碼。