Saltar al contenido

¿Cómo se construye un Singleton en Dart?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *