Solución:
Gracias a los constructores de fábrica de Dart, es fácil construir un singleton:
class Singleton {
static final Singleton _singleton = Singleton._internal();
factory Singleton() {
return _singleton;
}
Singleton._internal();
}
Puedes construirlo así
main() {
var s1 = Singleton();
var s2 = Singleton();
print(identical(s1, s2)); // true
print(s1 == s2); // true
}
Aquí hay una comparación de varias formas diferentes de crear un singleton en Dart.
1. Constructor de fábricas
class SingletonOne {
SingletonOne._privateConstructor();
static final SingletonOne _instance = SingletonOne._privateConstructor();
factory SingletonOne() {
return _instance;
}
}
2. Campo estático con getter
class SingletonTwo {
SingletonTwo._privateConstructor();
static final SingletonTwo _instance = SingletonTwo._privateConstructor();
static SingletonTwo get instance => _instance;
}
3. Campo estático
class SingletonThree {
SingletonThree._privateConstructor();
static final SingletonThree instance = SingletonThree._privateConstructor();
}
Cómo crear una instancia
Los singletons anteriores se instancian así:
SingletonOne one = SingletonOne();
SingletonTwo two = SingletonTwo.instance;
SingletonThree three = SingletonThree.instance;
Nota:
Originalmente hice esto como una pregunta, pero descubrí que todos los métodos anteriores son válidos y la elección depende en gran medida de las preferencias personales.
No me parece una lectura muy intuitiva new Singleton()
. Tienes que leer los documentos para saber que new
en realidad, no está creando una nueva instancia, como lo haría normalmente.
Aquí hay otra forma de hacer singletons (Básicamente lo que Andrew dijo arriba).
lib / thing.dart
library thing;
final Thing thing = new Thing._private();
class Thing {
Thing._private() { print('#2'); }
foo() {
print('#3');
}
}
main.dart
import 'package:thing/thing.dart';
main() {
print('#1');
thing.foo();
}
Tenga en cuenta que el singleton no se crea hasta la primera vez que se llama al getter debido a la inicialización diferida de Dart.
Si lo prefiere, también puede implementar singletons como getter estático en la clase singleton. es decir Thing.singleton
, en lugar de un captador de nivel superior.
Lea también la versión de Bob Nystrom sobre singletons de su libro de patrones de programación de juegos.