Dart 单例模式:工厂构造、静态变量与懒加载

Dart 语言单例模式实现

在 Dart 中实现单例模式有几种常见方法,下面介绍最常用的几种实现方式:

1. 工厂构造函数实现单例

这是 Dart 中最常用的单例实现方式:

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. 静态变量实现单例

dart 复制代码
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 关键字:

dart 复制代码
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 这样的依赖注入库:

dart 复制代码
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

相关推荐
louisgeek10 小时前
Flutter autoDispose、keepAlive 和 ref.keepAlive 的区别
flutter
左手厨刀右手茼蒿14 小时前
Flutter 三方库 firebase_admin 跨云边管线企业级鸿蒙管控底座适配风云:无障碍贯穿服务器授权防火墙打通底层生态授权域并构建海量设备推送集结-适配鸿蒙 HarmonyOS ohos
服务器·flutter·harmonyos
钛态14 小时前
Flutter for OpenHarmony:shelf_web_socket 快速构建 WebSocket 服务端,实现端到端实时通信(WebSocket 服务器) 深度解析与鸿蒙适配指南
服务器·前端·websocket·flutter·华为·性能优化·harmonyos
亚历克斯神14 小时前
Flutter 三方库 at_server_status 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、实时的 @protocol 去中心化身份服务器状态感知与鉴权监控引擎
flutter·华为·harmonyos
左手厨刀右手茼蒿17 小时前
Flutter 三方库 k_m_logic 的鸿蒙化适配指南 - 构建声明式的业务逻辑状态机、助力鸿蒙端复杂交互流程的解耦与重构
flutter·harmonyos·鸿蒙·openharmony·k_m_logic
钛态17 小时前
Flutter 三方库 result_type 深入鸿蒙强类型返回栈跨界交互适配:肃清空指针回调与运行时崩溃、大幅增注接口安全壁垒且提升多隔离桥接数据抛出健壮性-适配鸿蒙 HarmonyOS ohos
flutter·交互·harmonyos
左手厨刀右手茼蒿17 小时前
Flutter 三方库 invertible 的鸿蒙化适配指南 - 实现极致的撤销与重做流、助力鸿蒙端高交互编辑类应用开发
flutter·harmonyos·鸿蒙·openharmony
恋猫de小郭17 小时前
2026 AI 时代下,Flutter 和 Dart 的机遇和未来发展,AI 一体化
android·前端·flutter
加农炮手Jinx17 小时前
Flutter 三方库 fast_i18n 的鸿蒙化适配指南 - 掌握类型安全的国际化编译技术、助力鸿蒙应用构建全球化且极速响应的多语言交互体系
flutter·harmonyos·鸿蒙·openharmony·fast_i18n
钛态17 小时前
Flutter 三方库 test_process 的鸿蒙化适配指南 - 实现具备外部进程交互与命令行输出校验的集成测试套件、支持端侧 CLI 工具与自动化脚本协同实战
flutter·harmonyos·鸿蒙·openharmony·test_process