This website requires JavaScript.

js设计模式-单例模式

2018.12.16 09:44字数 1618阅读 25喜欢 0评论 0

在工作中往往总会忽略设计模式的重要性,虽然有意无意会使用到,但也不知道是哪种设计模式,设计模式算是一种前人留下的智慧结晶,一种经验,每种设计模式都会有它存在的意义,学习设计模式能在日常工作中更加高效的设计和架构我们的项目

单例模式是一种只允许实例化一次的对象类,又叫单体模式,也可以用来命名一个代码库,规范命名空间

一、简单使用
试想一下,在日常开发中,为了保持代码的单一职责的原则,一个复杂功能可能需要拆分成多个函数,有些基础函数命名不规范或者太简单的话,很可能造成函数名冲突,导致程序出现问题,而且会创建大量的全局变量,所以单例模式最基础的用法就是规范命名空间,就像JQuery
var Bing = {
    a: function () {},
    b: function () {
       let c = this.a()
       console.log(c)
    }
}
这种方式同样适用于管理代码模块,比如
var Bing = {
    utils: {
        util1: function () {},
        util2: function () {}
        ...
    },
    plugins: {
        plugin1: function () {},
        plugin2: function () {}
        ...
    },
    ...
}
使用起来结构就很清晰 Bing.utils.util1()

*以上方式的不足之处:
①没有什么封装性
②全局变量很容易造成命名空间污染。
③对象一开始变创建,万一我们用不上就浪费了

二、使用闭包创建单例
var getInstance = (function() {
    var _instance = null
    function Single() {
        return {
            firstName: 'zhang'
        }
    }
    return function() {
        if (!_instance) {
            _instance = Single()
        }
        return _instance
    }
})()

console.log(getInstance().firstName) // zhang

这种写法很明显的一个问题就是不通用,定义Single函数跟管理单例放在了同一个函数中,违反了单一职责原则

三、抽象管理单例
var getInstance = function(fn) {
    var result;
    return function(){
        return result || (result = fn.call(this,arguments));
    }
}
function Single() {
    return {
        firstName: 'zhang'
    }
}

let a = getInstance(Single)
let a1 = a()
let a2 = a()
console.log(a1 === a2)

以上均为伪代码,真实应用中会复杂的多,但是万变不离其宗,如果你想让系统中只存在一个对象,那么单例模式是最佳选择