Koa2对MongoDB连接的单例模式的封装

单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生。一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式。但是除了这两种方式,本文还会介绍其他几种实现单例的方式,让我们来一起看看吧。

简介

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。

许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

基本的实现思路

单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用ES6 class static这个关键字)。

单例的实现主要是通过以下两个步骤:

将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;

在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

单例模式特点:

1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。

单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性。

优点

系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。

缺点

当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new,可能会给其他开发人员造成困扰,特别是看不到源码的时候。

适用场合

  • 需要频繁的进行创建和销毁的对象;
  • 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
  • 工具类对象;
  • 频繁访问数据库或文件的对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**

* http://mongodb.github.io/node-mongodb-native

* http://mongodb.github.io/node-mongodb-native/3.0/api/
*/

//DB库
var MongoDB=require('mongodb');
var MongoClient =MongoDB.MongoClient;
const ObjectID = MongoDB.ObjectID;

var Config=require('./config.js');

class Db{

static getInstance(){ /*1、单例 多次实例化实例不共享的问题*/

if(!Db.instance){
Db.instance=new Db();
}
return Db.instance;
}

constructor(){

this.dbClient=''; /*属性 放db对象*/
this.connect(); /*实例化的时候就连接数据库*/

}

connect(){ /*连接数据库*/
let _that=this;
return new Promise((resolve,reject)=>{
if(!_that.dbClient){ /*1、解决数据库多次连接的问题*/
MongoClient.connect(Config.dbUrl,(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)=>{

var result=db.collection(collectionName).find(json);

result.toArray(function(err,docs){

if(err){
reject(err);
return;
}
resolve(docs);
})

})
})
}
update(collectionName,json1,json2){
return new Promise((resolve,reject)=>{


this.connect().then((db)=>{

//db.user.update({},{$set:{}})
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,function(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,function(err,result){
if(err){
reject(err);
}else{

resolve(result);
}
})


})
})
}
getObjectId(id){ /*mongodb里面查询 _id 把字符串转换成对象*/

return new ObjectID(id);
}
}


module.exports=Db.getInstance();