JS 设计模式之初识(一)-单例模式

一、定义

设计模式的定义是:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决 方案,通俗一点说,设计模式是在某种场合下对某个问题的一种解决方案。如果再通俗一点说,设计模式就是给面向对象软件开发中的一些好的设计取个名字。也就是说设计模式并不难,而只是一些目前公认的解决某些问题的最佳实现而已。

1. 单例模式

单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。例如:线程池,全局缓存,浏览器window对象等,这些都只需要一个对象实例就足够了。

1.1 实现单例模式

要实现单例模式也并不复杂,只要用一个变量来标识是否已经给某个类创建过实例,如果是,则在下一次获取该类的实例的时候,直接返回已经缓存好的实例, 否则创建并缓存这个实例。

1.单例模式实现一


    // 单例模式实现一
    function SingleTon(name) {
        this.name = name;
        this.instance = null;
    }
    SingleTon.prototype.getName = function() {
        return this.name;
    }
    SingleTon.getInstance = function(name) {
        if (this.instance) {
            return this.instance;
        }
        return new SingleTon(name);
    }
复制代码
  1. 单例模式实现二, 利用闭包
    // 单例模式实现二, 利用闭包
    function SingleTon2(name) {
        this.name = name;
    }
    SingleTon2.getInstance = (function(){
        let instance = null;
        return function(name) {
            if (!instance) {
                instance = new SingleTon2(name);
            }
            return instance;
        }
    })();
复制代码
  1. 实现三, 利用类
    // 实现三 类
    class SingleTon3 {
        constructor(props) {
            const { name, ...other } = props;
            this.name = name;
            this.instance = null; // 标识是否已经创建过实例
        }
        setName = () => {
            return this.name;
        }
        static getInstance = (name) => {
            this.instance = this.instance ? this.instance : new SingleTon3(name); 
            return this.instance;
        }
    }

    const t1 = SingleTon3.getInstance('timo1');
    const t2 = SingleTon3.getInstance('timo2');
    console.log('t1 => ',t1); // timo1
    console.log('t2 => ',t2); // timo1
    console.log('t1 === t2 => ',t1 === t2); // true
复制代码

注意: 类(class)通过static关键字定义静态方法。不能在类的实例上调用静态方法,而应该通过类本身调用。这些通常是实用程序方法,例如创建或克隆对象的功能

4.衍生, 使用闭包来封装私有变量

    // 使用闭包来封装私有变量
    const user = (function() {
        let name = 'timo';
        let age = 22;
        return {
            getUserInfo: function() {
                return name + ' '+ age;
            }
        };
    })();
复制代码

特别注意:let 和 const 声明并不会绑定到全局的window对象上!!!而使用var声明会自动绑定到window

总结:

单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对象,并且只创建唯一的一个。

转载于:https://juejin.im/post/5cfa1f2be51d45773d4685da

猜你喜欢

转载自blog.csdn.net/weixin_33670786/article/details/91475783
今日推荐