摘要:定义限制类的实例化次数只能是一次。如果该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例,如果实例已经存在,它会简单返回该对象的引用。适用场景需要频繁实例化然后销毁的对象。频繁访问数据库或文件的对象。
定义
限制类的实例化次数只能是一次。
如果该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例,如果实例已经存在,它会简单返回该对象的引用。
适用场景需要频繁实例化然后销毁的对象。
频繁访问数据库或文件的对象。
创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
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
摘要:在设计模式一书中,将单例模式称作单件模式。通过关键字,来保证不会同时有两个线程进入该方法的实例对象改善多线程问题为了符合大多数程序,很明显地,我们需要确保单例模式能在多线程的情况下正常工作。 在《Head First 设计模式》一书中,将单例模式称作单件模式。这里为了适应大环境,把它称之为大家更熟悉的单例模式。 一、了解单例模式 1.1 什么是单例模式 单例模式确保一个类只有一个实例,...
摘要:总之,选择单例模式就是为了避免不一致状态,避免政出多头。二饿汉式单例饿汉式单例类在类初始化时,已经自行实例化静态工厂方法饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。 单例模式有以下特点: 1、单例类只能有一个实例。 ...
摘要:博主按每天一个设计模式旨在初步领会设计模式的精髓,目前采用靠这吃饭和纯粹喜欢两种语言实现。单例模式用途如果一个类负责连接数据库的线程池日志记录逻辑等等,此时需要单例模式来保证对象不被重复创建,以达到降低开销的目的。 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(_靠这吃饭_)和python(_纯粹喜欢_)两种语言实现。诚然,每种设计模式都有多种实...
摘要:博主按每天一个设计模式旨在初步领会设计模式的精髓,目前采用靠这吃饭和纯粹喜欢两种语言实现。单例模式用途如果一个类负责连接数据库的线程池日志记录逻辑等等,此时需要单例模式来保证对象不被重复创建,以达到降低开销的目的。 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(_靠这吃饭_)和python(_纯粹喜欢_)两种语言实现。诚然,每种设计模式都有多种实...
阅读 1951·2019-08-29 16:44
阅读 2244·2019-08-29 16:30
阅读 875·2019-08-29 15:12
阅读 3606·2019-08-26 10:48
阅读 2724·2019-08-23 18:33
阅读 3882·2019-08-23 17:01
阅读 2015·2019-08-23 15:54
阅读 1368·2019-08-23 15:05