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

【Flutter】Dart 单例 ( 单例模式核心规则 | 饿汉式单例 | 懒汉式单例 | 极简空安全 懒汉式单例 | 工厂构造函数单例 )

文章目录

  • 一、单例模式核心规则
  • 二、饿汉式单例 ( 最推荐、企业首选 )
    • 1、饿汉式单例简介
    • 2、私有命名构造函数
    • 3、静态最终常量对象
  • 三、懒汉式单例
    • 1、懒汉式单例简介
    • 2、私有命名构造函数
    • 3、私有静态变量
    • 4、Getter 访问器
    • 5、空赋值运算符
    • 6、空安全断言符
  • 四、极简空安全 懒汉式单例
    • 1、极简空安全 懒汉式 单例简介
    • 2、箭头函数
  • 五、工厂构造函数单例
    • 1、工厂构造函数单例 简介
    • 2、factory 工厂构造函数

参考文档 :

  • Flutter 官方文档 : https://docs.flutter.dev/install/quick
  • 使用出现网络问题 , 参考 在中国网络环境下使用 Flutter 文档 ;





一、单例模式核心规则



Dart 单例模式 统一 核心规则 :

  • 私有构造 :Student._internal()→ 禁止外部 new , 这是一个私有 的 命名构造函数, 外部不能实例化 → 保证全局只有一个单例 ;
  • 静态实例 :类内部保存唯一" 私有 , 静态 " 对象 ;
  • 对外暴露 :通过 instance 或 factory 提供获取方式;
  • 验证单例 :identical(实例1, 实例2) == true

单例模式 首选饿汉式, 简单、安全、Flutter 官方 / 大厂都在用 ;





二、饿汉式单例 ( 最推荐、企业首选 )




1、饿汉式单例简介


饿汉式单例( 最推荐、企业首选 )在 类加载时 就创建实例, 安全、简单、无坑 ;

代码示例 :

classStudent{// 私有命名构造函数 ( 固定要求 )Student._internal();// 静态单例实例 ( 饿汉式 )staticfinalStudentinstance=Student._internal();// 测试方法voidstudy(){print("学生学习中");}}

使用方法 :

voidmain(){// 获取单例finals1=Student.instance;finals2=Student.instance;// 判断是否是同一个对象 ( true = 单例成功 )print(identical(s1,s2));// true// 调用方法s1.study();}

2、私有命名构造函数


Student._internal();私有命名构造函数 ;

Dart 中以下划线 _ 开头的成员 → 私有( 只有当前类内部能访问 ) ;

_internal 是构造函数的名字 ( 自定义名称 , 行业标准写法 ), 默认都写 internal , 也可以是其它 任意函数名字 ;


私有命名构造函数 的 作用 是 禁止外部创建对象 , 外部无法实例化 , 从根源保证单例 ;


3、静态最终常量对象


static final Student instance = Student._internal();是单例的核心代码 , 包含 4 个 Dart 关键知识点:

  • static静态 :静态成员属于类本身 , 不属于任何对象 ;
    • 全局只有一份 , 全局共享 ;
    • 调用方式:Student.instance , 不需要创建对象 ;
  • final最终常量 :final 赋值后不能再修改 , 保证 instance 永远指向第一次创建的那个对象 , 彻底保证唯一、不可替换 ;
  • Student类型 :表示这个静态变量存储的是 Student 类的实例对象 ;
  • = Student._internal();表示在 类加载时就自动创建单例 ( 饿汉式特点 ) ; 直接调用私有构造 , 创建唯一实例 ;




三、懒汉式单例




1、懒汉式单例简介


懒汉式单例 ,延迟初始化 , 第一次调用时才创建实例 ;

不用时不创建 , 用到时才创建 ; 节省资源 ;

代码示例 :

classStudent{// 私有命名构造函数 ( 固定要求 )Student._internal();// 私有静态变量staticStudent?_instance;// 公有 getter 获取单例staticStudentgetinstance{_instance??=Student._internal();return_instance!;}voidstudy(){print("学生学习中");}}

使用方法 :

voidmain(){finals1=Student.instance;finals2=Student.instance;print(identical(s1,s2));// trues2.study();}

2、私有命名构造函数


Student._internal();是 私有命名构造函数 , 其作用是禁止外部 new Student() 创建对象 , 保证单例唯一性 ;

Dart 中下划线开头的方法 / 变量 = 私有 , 仅类内部可访问 ;

_internal 是单例标准命名 , 也可以使用其它命名 ;


3、私有静态变量


static Student? _instance;静态私有变量, 其作用是内部存储单例对象 , 外部无法直接修改 ;

  • static:属于类 , 全局唯一一份 ;
  • ?Dart 空安全 , 可空类型 ;

4、Getter 访问器


static Student get instanceGetter 访问器 , Dart 类的 get 方法 , 不用括号调用 ;

其作用是 提供对外提供获取单例的统一入口 ;


Getter 访问器 标准语法 :没有参数 , 调用时不用写 () 括号 , 本质是方法 , 但用起来像属性 , 可以写逻辑 ( 判断、计算 ) ;

返回类型get名称{return要返回的值;}

简写语法 :

返回类型get名称=>要返回的值;

5、空赋值运算符


_instance ??= Student._internal();中的??=是 空赋值运算符 ,

变量 ??= 值表示变量为 null 时才赋值 , 否则不操作 ;

这是 懒汉式单例 的 核心 , 第一次调用才创建实例 , 之后直接返回单例对象 ;


6、空安全断言符


return _instance!;中的!空安全断言符, 作用是把可空对象转为非空 , 安全返回 ;

变量!→ 告诉编译器 " 此变量一定不为空 " ;





四、极简空安全 懒汉式单例




1、极简空安全 懒汉式 单例简介


极简空安全 懒汉式单例 是 Dart 空安全最简洁写法 ;

代码示例 :

classStudent{Student._internal();staticStudent?_instance;staticStudentgetinstance=>_instance??=Student._internal();voidstudy(){print("学生学习中");}}

使用方法 :

voidmain(){finalstudent=Student.instance;student.study();}

2、箭头函数


只是 将 普通 懒汉式 单例 的 Getter 方法 ,

// 公有 getter 获取单例staticStudentgetinstance{_instance??=Student._internal();return_instance!;}

简化为了如下写法 :

staticStudentgetinstance=>_instance??=Student._internal();




五、工厂构造函数单例




1、工厂构造函数单例 简介


这是在 饿汉式 单例模式 基础上 , 增加了一个 工厂构造函数 ;

工厂构造函数单例 的 调用最优雅 ,外部像普通类一样 Student() , 内部是单例 ;

代码示例 :

classStudent{Student._internal();staticfinalStudent_instance=Student._internal();// 工厂构造factoryStudent(){return_instance;}voidstudy(){print("学生学习中");}}

使用方法 :

voidmain(){// 像普通类一样调用 , 但永远是同一个单例finals1=Student();finals2=Student();print(identical(s1,s2));// true}

2、factory 工厂构造函数


下面的代码是 工厂构造函数 ,不自动生成新对象, 可自由返回对象 , 其作用是让外部Student()函数 拿到的永远是同一个单例 ;

// 工厂构造factoryStudent(){return_instance;}
http://www.cnnetsun.cn/news/2744510.html

相关文章:

  • 从零到一:用VGGT在几秒内重建你的三维世界
  • 3个步骤让您的Windows电脑飞起来:AtlasOS系统优化实战指南 [特殊字符]
  • 15分钟打造极致流畅的Windows系统:AtlasOS开源优化工具完全指南
  • 医用超声图像后处理:斑点噪声抑制算法详解
  • DeepSeek-R1-Distill-Qwen-1.5B-FP16与MindSpore深度集成指南:高效推理的终极解决方案
  • 清理C盘go,与java的文件
  • MediaCreationTool.bat:终极Windows 11安装解决方案,轻松绕过硬件限制
  • Qwen3.6-Plus实测:生产级大模型的稳定性与成本优化
  • PostgreSQL 技术日报 (4月13日)|内核讨论聚焦锁机制与性能优化
  • PostgreSQL 技术日报 (4月15日)|PGConf.De 2026 德国大会即将开幕
  • 从 Volatile 到 ThreadLocal:Java 线程安全机制备忘
  • HFSS仿真效率翻倍:巧用Floquet端口分析天线阵列,一个单元搞定整个周期结构
  • HFSS新手避坑指南:波端口和集总端口到底怎么选?手把手教你设置(附尺寸估算技巧)
  • AI工具链断裂导致虚拟主播“失语”?一文讲透RAG+TTS+VAD+ASR四层协同架构(含可运行Docker Compose配置)
  • 深度学习中过拟合的统一机制与DOM框架解析
  • 如何快速构建Go语言网络自动化工具:终极完整指南
  • OpenBCI Cyton/Ganglion/WiFi板的Python即用型数据采集工具包,含UDP/串口/MNE接口
  • PSINS工具箱入门第一步:手把手教你用glvf函数初始化地球参数(附完整参数表)
  • 医疗问答系统毕设包:Django前后端+MySQL用户数据+Neo4j疾病关系图谱(含部署文档、论文与演示PPT)
  • 告别玄学调试:用CubeMX仿真一步步揪出Boot跳转App跑飞的元凶
  • mcu内存
  • 告别Redis?用C语言写的LMDB内存数据库,在嵌入式场景下到底有多快?
  • 锂电SOC实时预测代码包:Informer-LSTM混合模型+多工况数据+可视化结果
  • 多通路炎症因子同步精准检测Luminex检测多因子重构免疫研究新生态,武汉云克隆多因子树立行业新标杆
  • 告别OPC!用Snap7和Visual Studio 2022轻松搞定西门子PLC通信(附避坑指南)
  • Claude智能工作台:Projects+Memory+Skills全栈配置指南
  • 极路由2 HC5761救砖记:TTL线救活‘认证失败’变砖机,保姆级刷机教程
  • 51单片机实现实时自适应温控:神经元PID算法+电炉仿真+LCD显示
  • 生命周期实际业务用法
  • 水果翻牌游戏新特性接入