设计模式之单例模式

本文介绍了JavaScript中的单例模式,包括不透明单例和封装单例,并展示了如何通过函数封装实现不同类型的单例扩展。同时,给出了单例模式在实际应用中的例子,如Redux中的createStore,强调了单例模式在确保全局唯一实例和资源管理中的作用。
摘要由CSDN通过智能技术生成

1. 单例模式
也就是整个项目中,就只有这一个实例,但是这个单例模式不透明,我们不知道
该调用getInstance的方法


class Animal {
    static instance;
    static getInstance() {
        // 如果不存在就创建一个 实例对象
        if(!Animal.instance) {
            Animal.instance = new Animal();
        }
        // 如果 存在就把这个实例 返回出去
        return Animal.instance;
    }
}

const a1 = Animal.getInstance();
const a2 = Animal.getInstance();
console.log(a1 === a2);  // true

2.封装单例模式
这个样子 我们就可以创建不同的种类了,但是每个的实例都是指向自己的,从而得到了扩展

function Animal () {

}

function Coffee () {

}

Animal.prototype.hello = function () {
    console.log("hello");
}


Coffee.prototype.hello = function () {
    console.log("hello");
}

let createInstance = function (Constructor) {
    let instance;
    return function() {
        if(!instance) {
            Constructor.apply(this, arguments);
            // 这个是把 this.__proto__ = Constructor.prototype,这个样子 就不会导致指向错误了
            Object.setPrototypeOf(this, Constructor.prototype);
            // 这个是把当前的 this原型赋值给他, 这个样子就可以判断,
            // 虽然是不同的种类 但是种类的实例都是指向自己的
            instance = this;
        }
        return instance;
    }
}

let createAnimal = createInstance(Animal);
let a1 = new createAnimal();
let a2 = new createAnimal();
console.log(a1 === a2, "a");   // true a

let createCoffee = createInstance(Coffee);
let c1 = new createCoffee();
let c2 = new createCoffee();

console.log(c1 == c2, "c");  // true c

使用场景:
redux中的createStore 就是一个单例模式,在整个项目中,store实例都是只有一个实例

import createStore from "redux";

function reducer() {

}

let initState = {};

// 这个createStore 就是一个单例模式, 全局的store都是共享的
let store = createStore(reducer, initState);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值