单例模式是一种23种设计模式中非常常见的一种。在内存中有且仅有一个该实例对象,可以避免频繁创建实例对象,节省内存。
代码
在Dart中,单例模式如下
class Singleton {
static Singleton? _instance;
Singleton._internal() {
_instance = this;
}
static get instance => _instance ?? Singleton._internal();
}
void main() {
Singleton test1 = Singleton.instance;
Singleton test2 = Singleton.instance;
print(test1.hashCode);
print(test2.hashCode);
}
运行结果:
123442092
123442092
在Dart中,使用工厂构造函数,更优雅的单例模式如下
class Singleton {
static Singleton? _instance;
Singleton._internal() {
_instance = this;
}
factory Singleton() => _instance ?? Singleton._internal();
}
void main() {
Singleton test1 = Singleton();
Singleton test2 = Singleton();
print(test1.hashCode);
print(test2.hashCode);
}
运行结果:
793614242
793614242
注意
• 以上两种写法均为饿汉模式。当使用懒汉模式,因为Dart是单线程,所以无需担心线程安全。
• “?”:在Dart中,支持空安全,表示该变量可以为Null。
• “!”:在Dart中,判断变量是否为Null,若为Null,则抛出异常,否则继续运行。
• “_”:在Dart中,表示私有属性和私有方法。
• “ClassName._xxx()”:私有的命名构造函数。
•“get”:该修饰词所修饰的方法(不写括号)可以使外部获取实例的私有属性,调用时也不用写括号。
• “??”:a??b,若a为Null,则返回b,否则返回a。
• “??=”:a??=b,若a为Null,则把b赋值给a,并返回a。
• “factory”:该关键词,DartVM不会再创建一个新的实例对象,而是在内存中返回已存在的实例对象。工厂构造函数不能访问this。普通构造不需要返回值,工厂构造函数需要返回值。