单例设计模式

141 阅读2分钟

设计模式

设计模式就是一种思想,这种思想能帮助我们解决问题 这就叫设计模式

案例

var name = '东方淼淼';
var age = 18;
var BF = false;
var name = "mini";
var age = 62;
var BF = true;

这个时候就会出现全局变量污染的问题 那如何解决呢?

解决方案一.闭包的保护作用

(function () {
    var name = '东方淼淼';
    var age = 18;
    var BF = false;
})();
(function () {
    var name = "mini";
    var age = 62;
    var BF = true;
})();

解决方案2:单例设计模式

把描述同一事物的属性和方法放在一起,实现了分组的效果,避免了全局变量的污染;

每一个对象都是一个单独的实例(个体/堆内存空间),所以我们把这种方案称之为“单例设计模式”!!

单例模式也可以理解为一个对象

在单例设计模式中,person1不仅是对象名,它也被称为“命名空间”(namespace)。

var person1 = {
    name: '东方淼淼',
    age: 18,
    BF: false
};
var person2 = {
    name: 'mini',
    age: 62,
    BF: true
}; 

命名空间

  • 把每一个对象值 赋值给变量 =>可以理解为,给每一个对象的堆内存空间起了个变量名,所以此时可以把这个变量称为 “命名空间” var pesrsion1={} pesrsion1 命名空间
  • 当前对象中的键值对都是 命名空间 中私有的键值对

高级单例模式

var nameSpace=(function(){
     function fn(){},
     var a=2;
     //... 在这个上下文还有很多的变量和方法,
     return{
        // 想要把谁暴露出去,就放到这对象中
        fn:fn
     }
})();
console.log(nameSpace.fn)

nameSpace 和自执行函数没有关系,最终是等于自执行函数的返回值,最终是把返回对象的堆内存的地址给了nameSpace

高级单例模式也可以理解为一个函数返回了一个对象

【项目实战中单例模式的应用】

  • 在公司一般都是团队协作开发,每人都会分配不同的任务,开发自己的模块
  • 对于整个项目中,公用的功能,可以提取出来,供大家使用

我们做的时候为了避免全局污染,把每个功能写在闭包中

//员工1
var newsModule = (function () {
    var box = null;
    var query = function query() {};

    // 需求:把这个私有的方法setVal,在其它板块中使用
    var setVal = function setVal() {};//私有的

    // 解决1:直接挂载到GO中「弊端:挂载的东西多了,很可能有引发全局变量污染」
    window.setVal = setVal;

    // 解决2:基于返回值,返回一个对象(命名空间),里面包含需要供外部调用的属性和方法即可
    return {
        setVal: setVal,
        query: query
    };
})();

// 换肤板块//员工1
var skinModule = (function () {
    var box = null;
    var query = function query() {};
    setVal();//调用的是全局

    return {};
})();

// 搜索板块//员工1
var searchModule = (function () {
    var query = function query() {};
    newsModule.setVal();//调取的是newModule里的

    return {};
})();
//如果对象的属性是一个函数 则可以这样简写
let ShopModel=(function(){
    return{
        init:function(){
            //...
        }
        //简写方式
        init(){
            //...
        }
    }
})();