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));
// 输出 true
service1.doSomething();
}

注意事项

  1. 单例模式适用于需要全局唯一实例的场景,如配置管理、日志记录器等
  2. 过度使用单例可能导致代码难以测试和维护
  3. 在 Dart 中,工厂构造函数是实现单例最简洁的方式
  4. 对于需要懒加载的场景,可以使用 late 关键字

选择哪种实现方式取决于你的具体需求和项目规模。对于简单项目,工厂构造函数方式就足够了;对于复杂项目,考虑使用依赖注入库如 get_it

posted @ 2025-08-11 13:34  wzzkaifa  阅读(34)  评论(0)    收藏  举报