zoukankan      html  css  js  c++  java
  • 【设计模式】Javascript设计模式——单例模式

    单例模式

    一、什么叫单例模式

    ​ 保证一个类仅有一个实例对象,并提供一个访问它的全局访问点.

    二、有什么用

    ​ 创建完之后,只有一个实例,之后再怎么创建,都是这一个,方便实例管理,提供了对实例的受控访问。

    ​ 对于频繁创建,销毁对象,这个单例模式实现了对象统一,内存只占有一个对象内存分量,在频繁创建中,大大的节约了系统内存。

    三、核心点

    1. 只有一个实例
    2. 全局可访问该实例
    3. 自行实例化(主动实例化)
    4. 可推迟初始化,即延迟执行(与静态类/对象的区别)

    四、Coding

    //一个正常的普通对象
    function Girlfriend(name, age) {
        this.name = name;
        this.age = age;
        this.sayName = () => {
        return `我叫${this.name},今年${this.age}岁`;
        };
        this.eat = (num) => {
        return `我一天能吃${num}顿饭`;
        };
    }
    //每次使用都需要去new一个girlfriend对象,然后调用对应的方法
    let g1 = new Girlfriend("小倩", 23);
    //调用对象的方法
    console.log(g1.sayName());
    console.log(g1.eat(3))
    let g2 = new Girlfriend("小胖妞", 25);
    //调用对象的方法
    console.log(g2.sayName());
    console.log(g2.eat(8))
    
    //对比两个对象,不是一个对象
    console.log(g1 === g2); // ==> false 
    
    //单例模式获取对象
    let SingletonGirlfriend = (()=>{
        //等待实例的对象
        function Girlfriend(name, age){
            this.name = name;
            this.age = age;
            this.sayName = () => {
            	return `我叫${this.name},今年${this.age}岁`;
            };
            this.eat = (num) => {
            	return `我一天能吃${num}顿饭`;
            };
        }
        //这个就是最终的实例,利于闭包,缓存一个内部变量
        var instance = null;
        return {
            getInstance:()=>{
                if(!instance){
                    instance = new Girlfriend(`小倩`, 26);//固定的人,做谁的女朋友都叫小倩
                    //这里锁定属性不可修改
                    Object.freeze(instance);
                    //或使用defineProperty修改对象那个属性writable+configurable,防止篡改
                    Object.defineProperty(instance,`name`,{
                        value: `小倩`,
                        writable: false,
                        enumerable: true,
                        configurable: false
                    })
                }
                return instance;
            }
        }
    })()
    //这里直接获取实例对象
    let g1 = SingletonGirlfriend.getInstance();
    console.log(g1.sayName());//做谁的女朋友都叫小倩
    console.log(g1.eat(3));//跟穷人一天吃3顿饭
    let g2 = SingletonGirlfriend.getInstance();
    console.log(g2.sayName());//做谁的女朋友都叫小倩
    console.log(g2.eat(8));//跟富二代一天吃8顿
    
    //对比两个对象,是一个对象
    console.log(g1 === g2); // ==> true是同一个叫小倩的
    

    五、小结

    个人认为单例模式得目的很简单为了维护统一一个全局对象,实现得方式我觉得多种多样,利用闭包,立即执行函数,静态属性等都可以实现,根据具体得业务去Coding不同得代码,实现方式多种多样,后续补充。

  • 相关阅读:
    SmartPlant Review 渲染模块低性能设置
    由浅入深:Python 中如何实现自动导入缺失的库?(转)
    itchat初步解读登录(转)
    转:【开源必备】常用git命令
    2.转发。基于itchat的微信消息同步机器人
    1、初学探讨PYTHON的itchat和wxpy两库
    学习git 新手。这个写的不错
    常见的内置错误及处理
    面试题记录1
    防抖
  • 原文地址:https://www.cnblogs.com/alenghan/p/13207101.html
Copyright © 2011-2022 走看看