本文作者在此示例中使用单例作为服务层Node api:
https://html5hive.org/how-to-create-rest-api-with-node-js-and-express/
他说,“我们只希望有一个我们的播放器服务的实例,所以我们不会导出类本身,而是导出它的新实例。节点中的模块文件只执行一次,所以这实际上给了我们一个单身人士。“
'use strict';
var uuid = require('node-uuid');
class PlayersService {
constructor() {
this.players = [];
}
getPlayers() {
return this.players;
}
getSinglePlayer(playerId) {
var player = this.players.filter(p => p.id === playerId)[0];
return player || null;
}
addPlayer(info) {
// prevent a bit of bad/duplicate data
if (!info || this.players.filter(p => (p.firstName === info.firstName && p.lastName === info.lastName)).length > 0) {
return false;
}
info.id = uuid.v4();
this.players.push(info);
return true;
}
updatePlayer(playerId, info) {
var player = this.getSinglePlayer(playerId);
if (player) {
player.firstName = info.firstName ? info.firstName : player.firstName;
player.lastName = info.lastName ? info.lastName : player.lastName;
player.displayName = info.displayName ? info.displayName : player.displayName;
return true;
}
return false;
}
}
module.exports = new PlayersService();
这似乎是合理的,因为这些服务的功能是为使用它们的控制器提供相同的实现。
然而,在这篇文章中:
On Design Patterns: When to use the Singleton?
海报要求为Logger类以外的单身人士提供合法用例。有几个人回答他的问题时说不应该使用单身人士。
但是,对于像我在这里复制的服务那样的单一服务是不是使用合法的用例和最佳实践,这样你就不会创建提供相同实现的多个实例?感谢。