Как построить синглтон в Dart?



одноэлементный шаблон гарантирует, что будет создан только один экземпляр класса. Как мне построить это в Dart?

795   6  

6 ответов:

спасибо Dart's заводские конструкторы, это легко построить синглтон:

class Singleton {
  static final Singleton _singleton = new Singleton._internal();

  factory Singleton() {
    return _singleton;
  }

  Singleton._internal();
}

вы можете построить его с new

main() {
  var s1 = new Singleton();
  var s2 = new Singleton();
  print(identical(s1, s2));  // true
  print(s1 == s2);           // true
}

Я не нахожу это очень интуитивным чтением нового Синглтона (). Вы должны прочитать документы, чтобы знать, что new На самом деле не создает новый экземпляр, как это обычно бывает.

вот еще один способ сделать синглтоны (в основном то, что Андрей сказал выше).

lib / thing.Дарт

library thing;

final Thing thing = new Thing._private();

class Thing {
   Thing._private() { print('#2'); }
   foo() {
     print('#3');
   }
}

главная.Дарт

import 'package:thing/thing.dart';

main() {
  print('#1');
  thing.foo();
}

обратите внимание, что синглтон не создается до первого вызова геттера из-за ленивой инициализации Dart.

Если вы предпочитаете, чтобы вы также могли реализовать синглеты как статический геттер в одноэлементном классе. то есть вещь.синглтон, а не геттер верхнего уровня.

также читайте Боб Нистром взять на синглтоны из его книги шаблонов программирования игр.

как насчет того, чтобы просто использовать глобальную переменную в вашей библиотеке, например?

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);
}

или это не одобряется?

одноэлементный шаблон необходим в Java, где понятие глобалов не существует, но кажется, что вам не нужно идти длинным путем в Dart.

Dart singleton от const constructor & factory

class Singleton {
  factory Singleton() =>
    const Singleton._internal_();
  const Singleton._internal_();
}


void main() {
  print(new Singleton() == new Singleton());
  print(identical(new Singleton() , new Singleton()));
}

вот еще один возможный вариант:

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;
}

вот краткий пример, который сочетает в себе другие решения. Доступ к синглтону можно сделать с помощью:

  • С помощью singleton глобальная переменная, указывающая на экземпляр.
  • общие Singleton.instance узор.
  • используя конструктор по умолчанию, который является фабрикой, которая возвращает экземпляр.

Примечание: вы должны реализовать только один из трех вариантов, так что код, используя синглтон последовательный.

Singleton get singleton => Singleton.instance;
ComplexSingleton get complexSingleton => ComplexSingleton._instance;

class Singleton {
  static final Singleton instance = Singleton._private();
  Singleton._private();
  factory Singleton() => instance;
}

class ComplexSingleton {
  static ComplexSingleton _instance;
  static ComplexSingleton get instance => _instance;
  static void init(arg) => _instance ??= ComplexSingleton._init(arg);

  final property;
  ComplexSingleton._init(this.property);
  factory ComplexSingleton() => _instance;
}

Если вам нужно выполнить сложную инициализацию, вам просто нужно сделать это перед использованием экземпляра позже в программе.

пример

void main() {
  print(identical(singleton, Singleton.instance));        // true
  print(identical(singleton, Singleton()));               // true
  print(complexSingleton == null);                        // true
  ComplexSingleton.init(0); 
  print(complexSingleton == null);                        // false
  print(identical(complexSingleton, ComplexSingleton())); // true
}

Comments

    Ничего не найдено.