当前位置: 首页 > news >正文

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();
}

注意事项

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

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

http://www.dtcms.com/a/322089.html

相关文章:

  • 频谱图学习笔记
  • python 通过Serper API联网搜索并大模型整理内容
  • 软件测试面试常见问题【含答案】
  • EtherCAT WatchDog
  • V4L2摄像头采集 + WiFi实时传输实战全流程
  • 深圳市天正达电子股份有限公司参展AUTO TECH China 2025 广州国际汽车技术展览会
  • std::transform
  • AI大模型专题:LLM大模型(Prompt提示词工程)
  • C语言实现经典扫雷游戏全解析
  • 使用观测云打造企业级监控告警中心
  • cudagraph 本质详解
  • Vue框架进阶
  • 宠智灵打造宠物AI开放平台:精准识别、灵活部署、生态共建
  • C++入门(上) -- 讲解超详细
  • 【狂神说java学习笔记】四:java流程控制(用户交互Scanner、顺序结构、if选择结构、switch选择结构)
  • isulad + harbor私有仓库登录
  • 大模型性能测试实战指南:从原理到落地的全链路解析
  • Claude使用报错 Error: Cannot find module ‘./yoga.wasm‘
  • 鸿蒙中使用tree
  • 系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇
  • 安全基础DAY1-安全概述
  • Xiphos Q8 摄像头板 高性能图像处理板
  • 案例实战:机器学习预测粘度+耐热高分子筛选,聚合物研发效率倍增秘籍
  • 锯床自动长度检测与参数闭环补偿系统
  • 2025年环境工程与新能源科学国际会议(EENES 2025)
  • x265开源编码器源码框架深度解析
  • 知识图谱【2】
  • 五、SpringBoot工程打包与运行
  • SpringAI实现多用户记忆隔离
  • 【SpringAI】9.创建本地mcp服务(演示通过mcp实现联网搜索)