你如何在Dartbuild立一个单身人士?
单例模式确保只创build一个类的一个实例。 我如何在Dart中build立这个?
感谢Dart的工厂构造函数 ,很容易构build一个单例:
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 }
我不觉得它非常直观地阅读新的Singleton()。 你必须阅读文档才能知道新的实际上并不是真的创build一个新的实例。
这是另一种做单身的方法(基本上是Andrew所说的)。
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(); }
请注意,由于Dart的延迟初始化,在第一次调用getter之前,单例不会被创build。
如果你愿意,你也可以在singleton类上实现单身作为静态getter。 即Thing.singleton,而不是顶级的getter。
还请阅读Bob Nystrom 从他的游戏编程模式书中获得的单身人士 。
在库中使用全局variables怎么样?
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; ai = 2; print(bi); }
或者这皱起了眉头?
Java中单例模式是必需的,但全局概念并不存在,但似乎你不需要在Dart中走很长的路。
飞镖单体由const构造函数和工厂
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; }