Dart 单例模式:工厂构造、静态变量与懒加载
Dart 语言单例模式实现
在 Dart 中实现单例模式有几种常见方法,下面介绍最常用的几种实现方式:
1. 工厂构造函数实现单例
这是 Dart 中最常用的单例实现方式:
class Singleton {// 私有静态实例static final Singleton _instance = Singleton._internal();// 工厂构造函数factory Singleton() {return _instance;}// 私有构造函数Singleton._internal();// 其他方法void doSomething() {print("Doing something...");}
}// 使用
void main() {var singleton1 = Singleton();var singleton2 = Singleton();print(identical(singleton1, singleton2)); // 输出 true
}
2. 静态变量实现单例
class Singleton {// 静态最终实例static final Singleton _instance = Singleton._internal();// 获取实例的静态方法static Singleton get instance => _instance;// 私有构造函数Singleton._internal();// 其他方法void doSomething() {print("Doing something...");}
}// 使用
void main() {var singleton1 = Singleton.instance;var singleton2 = Singleton.instance;print(identical(singleton1, singleton2)); // 输出 true
}
3. 延迟初始化单例 (懒加载)
如果需要延迟初始化实例,可以使用 late
关键字:
class LazySingleton {// 使用 late 关键字延迟初始化static late final LazySingleton _instance = LazySingleton._internal();factory LazySingleton() {return _instance;}LazySingleton._internal();void doSomething() {print("Doing something...");}
}// 使用
void main() {var singleton1 = LazySingleton();var singleton2 = LazySingleton();print(identical(singleton1, singleton2)); // 输出 true
}
4. 使用 get_it 包实现单例 (推荐用于大型项目)
对于大型项目,可以使用 get_it
这样的依赖注入库:
import 'package:get_it/get_it.dart';class Service {void doSomething() => print("Doing something...");
}final getIt = GetIt.instance;void setup() {getIt.registerSingleton<Service>(Service());
}void main() {setup();var service1 = getIt<Service>();var service2 = getIt<Service>();print(identical(service1, service2)); // 输出 trueservice1.doSomething();
}
注意事项
- 单例模式适用于需要全局唯一实例的场景,如配置管理、日志记录器等
- 过度使用单例可能导致代码难以测试和维护
- 在 Dart 中,工厂构造函数是实现单例最简洁的方式
- 对于需要懒加载的场景,可以使用
late
关键字
选择哪种实现方式取决于你的具体需求和项目规模。对于简单项目,工厂构造函数方式就足够了;对于复杂项目,考虑使用依赖注入库如 get_it
。