Das Singleton-Muster stellt sicher, dass immer nur eine Instanz einer Klasse erstellt wird. Wie baue ich das in Dart?
Antworten
Zu viele Anzeigen?Da ich nicht gerne die new
Schlüsselwort oder andere konstruktorähnliche Aufrufe für Singletons zu verwenden, würde ich es vorziehen, einen statischen Getter namens inst
zum Beispiel:
// the singleton class
class Dao {
// singleton boilerplate
Dao._internal() {}
static final Dao _singleton = new Dao._internal();
static get inst => _singleton;
// business logic
void greet() => print("Hello from singleton");
}
Anwendungsbeispiel:
Dao.inst.greet(); // call a method
// Dao x = new Dao(); // compiler error: Method not found: 'Dao'
// verify that there only exists one and only one instance
assert(identical(Dao.inst, Dao.inst));
Singleton erstellen
class PermissionSettingService {
static PermissionSettingService _singleton = PermissionSettingService._internal();
factory PermissionSettingService() {
return _singleton;
}
PermissionSettingService._internal();
}
Singleton zurücksetzen
// add this function inside the function
void reset() {
_singleton = PermissionSettingService._internal();
}
Es ist nicht schwierig, ein Singleton in Dart zu erstellen. Sie können jede Variable auf oberster Ebene (global) deklarieren, die standardmäßig ein Singleton ist. Sie können eine Variable auch als statisches Mitglied einer Klasse deklarieren. Dies ist ein Singleton A
.
class A {}
final a = A();
Allerdings können Sie die Instanz zu Testzwecken nicht ersetzen. Das andere Problem ist, dass Sie mit zunehmender Komplexität der Anwendung möglicherweise globale oder statische Variablen in transiente Abhängigkeiten innerhalb Ihrer Klassen umwandeln möchten. Wenn Sie Dependency Injection verwenden, können Sie eine Abhängigkeit innerhalb Ihrer Komposition jederzeit ändern. Dies ist ein Beispiel für die Verwendung von ioc_container um eine Einzelinstanz von A
im Root einer App. Sie können dies jederzeit in eine transiente Abhängigkeit ändern, indem Sie add
anstelle von addSingletonService
import 'package:ioc_container/ioc_container.dart';
class A {}
void main(List<String> arguments) {
final builder = IocContainerBuilder()..addSingletonService(A());
final container = builder.toContainer();
final a1 = container<A>();
final a2 = container<A>();
print(identical(a1, a2));
}
Die obigen Drucke true
weil die Anwendung immer nur eine Instanz von A
.