Le modèle singleton garantit qu'une seule instance d'une classe est créée. Comment puis-je construire cela dans Dart?
Réponses
Trop de publicités?Grâce aux constructeurs d'usine de Dart, il est facile de créer un singleton:
class Singleton {
static final Singleton _singleton = new Singleton._internal();
factory Singleton() {
return _singleton;
}
Singleton._internal();
}
Vous pouvez le construire avec new
main() {
var s1 = new Singleton();
var s2 = new Singleton();
print(identical(s1, s2)); // true
print(s1 == s2); // true
}
Je ne trouve pas ça très intuitif lecture new Singleton(). Vous devez lire la documentation pour savoir que la nouvelle n'est pas vraiment de la création d'une nouvelle instance, comme il le ferait normalement.
Voici une autre façon de faire des singletons (Fondamentalement, ce que Andrew a dit ci-dessus).
lib/chose.dart
library thing;
final Thing thing = new Thing._private();
class Thing {
Thing._private() { print('#2'); }
foo() {
print('#3');
}
}
principal.dart
import 'package:thing/thing.dart';
main() {
print('#1');
thing.foo();
}
Notez que le singleton n'est pas créées jusqu'à ce que le premier temps de la lecture est appelé en raison de la Dart initialisation.
Si vous préférez, vous pouvez également mettre en place des singletons comme statique de lecture sur la classe singleton. c'est à dire de la Chose.singleton, au lieu de un haut niveau de lecture.
Lire aussi Bob Nystrom de prendre sur les singletons de son Jeu de modèles de programmation livre.
Qu'en est-il de l'utilisation d'une variable globale dans votre bibliothèque, comme ceci?
single.dart
:
library singleton;
var Singleton = new Impl();
class Impl {
int i;
}
main.dart
:
import 'single.dart';
void main() {
var a = Singleton;
var b = Singleton;
a.i = 2;
print(b.i);
}
Ou est-ce mal vu?
Le modèle singleton est nécessaire en Java, là où le concept de globals n'existe pas, mais il semble que vous ne devriez pas avoir à faire beaucoup de chemin dans Dart.
Voici un autre moyen possible:
void main() {
var s1 = Singleton.instance;
s1.somedata = 123;
var s2 = Singleton.instance;
print(s2.somedata); // 123
print(identical(s1, s2)); // true
print(s1 == s2); // true
//var s3 = new Singleton(); //produces a warning re missing default constructor and breaks on execution
}
class Singleton {
static final Singleton _singleton = new Singleton._internal();
Singleton._internal();
static Singleton get instance => _singleton;
var somedata;
}