资讯专栏INFORMATION COLUMN

JS设计模式之Singleton(单例)模式

SillyMonkey / 1703人阅读

摘要:定义限制类的实例化次数只能是一次。如果该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例,如果实例已经存在,它会简单返回该对象的引用。适用场景需要频繁实例化然后销毁的对象。频繁访问数据库或文件的对象。

定义

限制类的实例化次数只能是一次。

如果该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例,如果实例已经存在,它会简单返回该对象的引用。

适用场景

需要频繁实例化然后销毁的对象。

频繁访问数据库或文件的对象。

创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

Talk is cheap

通过打印privateRandomNumber来验证是否为同一个实例

let mySingleton = (()=> {
    let instance;

    let init = ()=> {
        let privateMethod = ()=> {//私有方法
            console.log("I am privateMethod");
        }

        let privateVariable = "I am also private";
        let privateRandomNumber = Math.random();

        return {//共有方法和变量
            publicMethod: ()=> {
                console.log("I am public");
            },
            publicProperty: "I am also public",
            getRandomNumber: ()=> {
                return privateRandomNumber;
            }
        }
    }

    return {//获取Singleton的实例,如果存在就返回,不存在就创建新实例
        getInstance: ()=> {
            if(!instance) {
                instance = init();
            }

            return instance;
        }
    }

})();

let singleA = mySingleton.getInstance();
let singleB = mySingleton.getInstance();

console.log(singleA.getRandomNumber() === singleB.getRandomNumber());//ture

简单封装node连接mongodb数据库

const MongoDB = require("mongodb")
const MongoClient = require("mongodb").MongoClient
const ObjectID = MongoDB.ObjectID
const Config = require("./config")

class Db {
    static getInstance() {
        if(!Db.instance) {
            Db.instance = new Db()
        }
        return Db.instance
    }
    constructor() {
        this.dbClient = ""
        this.connect()
    }
    connect() {//连接数据库
        let that = this

        return new Promise((resolve, reject)=> {
            if(!that.dbClient) {
                MongoClient.connect(Config.dbUrl, {useNewUrlParser:true}, (err, client)=> {
                    if(err) {
                        reject(err)
                    }else {
                        that.dbClient = client.db(Config.dbName)
                        resolve(that.dbClient)
                    }
                })
            }else {
                resolve(that.dbClient)
            }
        })
    }
    find(collectionName, json) {
        return new Promise((resolve, reject)=> {
            this.connect().then((db)=> {
                let result = db.collection(collectionName).find(json)

                result.toArray((err, docs)=> {
                    if(err) {
                        reject(err)
                        return
                    }
                    resolve(docs)
                })
            })
        })
    }
    update(collectionName, json1, json2) {
        return new Promise((resolve, reject)=> {
            this.connect().then((db)=> {
                db.collection(collectionName).updateOne(json1, {
                    $set: json2
                },(err, result)=> {
                    if(err) {
                        reject(err)
                    }else {
                        resolve(result)
                    }
                })
            })
        })
    }
    insert(collectionName, json) {
        return new Promise((resolve, reject)=> {
            this.connect().then((db)=> {
                db.collection(collectionName).insertOne(json, (err, result)=> {
                    if(err) {
                        reject(err)
                    }else {
                        resolve(result)
                    }
                })
            })
        })
    }
    remove(collectionName, json) {
        return new Promise((resolve, reject)=> {
            this.connect().then((db)=> {
                db.collection(collectionName).removeOne(json, (err, result)=> {
                    if(err) {
                        reject(err)
                    }else {
                        resolve(result)
                    }
                })
            })
        })
    }
    getObjectId(id) {
        return new ObjectID(id)
    }
}

module.exports = Db.getInstance()
参考

《Javascript设计模式》

JS设计模式系列文章

JS设计模式之Obeserver(观察者)模式、Publish/Subscribe(发布/订阅)模式
JS设计模式之Factory(工厂)模式
JS设计模式之Singleton(单例)模式
JS设计模式之Facade(外观)模式
JS设计模式之Module(模块)模式、Revealing Module(揭示模块)模式

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100715.html

相关文章

  • Java 设计模式单例模式

    摘要:在设计模式一书中,将单例模式称作单件模式。通过关键字,来保证不会同时有两个线程进入该方法的实例对象改善多线程问题为了符合大多数程序,很明显地,我们需要确保单例模式能在多线程的情况下正常工作。 在《Head First 设计模式》一书中,将单例模式称作单件模式。这里为了适应大环境,把它称之为大家更熟悉的单例模式。 一、了解单例模式 1.1 什么是单例模式 单例模式确保一个类只有一个实例,...

    everfight 评论0 收藏0
  • Java基础学习——多线程单例设计模式(转)

    摘要:总之,选择单例模式就是为了避免不一致状态,避免政出多头。二饿汉式单例饿汉式单例类在类初始化时,已经自行实例化静态工厂方法饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。 概念:  Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。  单例模式有以下特点:  1、单例类只能有一个实例。 ...

    dendoink 评论0 收藏0
  • 设计模式单例模式

    摘要:这种情况带来的后果是程序两次创建了对象,这并不符合我们对单例模式的定义。实现的三个特性自由序列化线程安全保证单例。其次,有且仅有的构造器,防止外部的额外构造,这恰好与单例模式吻合。 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。当系统需要某个类只能有一个实例时,就可以采用单例模式。 保证单例模式仅有一个实例的核心思想是构造方法私有化,即不允许外部调用该类的构造方法。基于...

    xuweijian 评论0 收藏0
  • 每天一个设计模式单例模式

    摘要:博主按每天一个设计模式旨在初步领会设计模式的精髓,目前采用靠这吃饭和纯粹喜欢两种语言实现。单例模式用途如果一个类负责连接数据库的线程池日志记录逻辑等等,此时需要单例模式来保证对象不被重复创建,以达到降低开销的目的。 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(_靠这吃饭_)和python(_纯粹喜欢_)两种语言实现。诚然,每种设计模式都有多种实...

    yy736044583 评论0 收藏0
  • 每天一个设计模式单例模式

    摘要:博主按每天一个设计模式旨在初步领会设计模式的精髓,目前采用靠这吃饭和纯粹喜欢两种语言实现。单例模式用途如果一个类负责连接数据库的线程池日志记录逻辑等等,此时需要单例模式来保证对象不被重复创建,以达到降低开销的目的。 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(_靠这吃饭_)和python(_纯粹喜欢_)两种语言实现。诚然,每种设计模式都有多种实...

    lijy91 评论0 收藏0

发表评论

0条评论

SillyMonkey

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<