flutter factory 单例模式
构造方法上的唯一对象与单例模式当需要构造函数不是每次都创建一个新的对象时 使用factory关键字

单例模式
创建类型的软件设计模式 单例模式的方法创建的类在当前进程中只有一个实例
单例模式必要性
系统中存在多个打印任务
但只能有一个正在工作的任务
一个系统只能有一个窗口管理器或文件系统
一个系统只能有一个计时工具或ID(序号)生成器
Windows就只能打开一个任务管理器
如果不使用机制对窗口对象进行唯一化将弹出多个窗口
如果这些窗口显示的内容完全一致则是重复对象浪费内存资源
如果这些窗口显示的内容不一致则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解不知道哪一个才是真实的状态
因此确保系统某个对象的唯一性即一个类只能有一个实例非常重要
如何保证一个类只有一个实例且实例易于被访问
让类自身负责保存它的唯一实例
这个类可以保证没有其他实例被创建
且提供一个访问该实例的方法 这就是单例模式的模式动机
根据需要可能一个线程中属于单例,如仅线程上下文内使用同一个实例一个类有且仅有一个实例,并且自行实例化向整个系统提供

单例模式三个要点
一某个类只能有一个实例
二必须自行创建这个实例
三是必须自行向整个系统提供这个实例
单例模式是设计模式中最简单的形式目的是使类的一个对象成为系统中的唯一实例

用只允许生成对象类的唯一实例的机制
阻止所有想要生成对象的访问
使用工厂方法来限制实例化过程
这个方法应该是静态方法(类方法)
因为让类的实例去生成另一个唯一实例无意义
实现方式
通常单例模式有两种构建方式
懒汉式 线程不安全
最基础的实现方式,线程上下文单例,不需要共享给所有线程,也不需要加synchronize之类的锁,以提高性能
懒汉式 线程安全
加上synchronize之类保证线程安全的基础上的懒汉模式,相对性能很低,大部分时间并不需要同步
饿汉方式
指全局的单例实例在类装载时构建
双检锁式
在懒汉式基础上利用synchronize关键字和volatile关键字确保第一次创建时没有线程间竞争而产生多个实例,仅第一次创建时同步,性能相对较高
登记式
作为创建类的全局属性存在,创建类被装载时创建
枚举
枚举类本身也是一种单例模式

Flutter中dart的单例模式设计
创建单例的Manager类
class Manager {
  // 工厂模式 : 单例公开访问点
  factory Manager() => _getInstance();
  static Manager get instance => _getInstance();
  // 静态私有成员,没有初始化
  static Manager _instance;
  // 私有构造函数// 具体初始化代码
  Manager._internal() {}
  // 静态、同步、私有访问点
  static Manager _getInstance() {
    if (_instance == null) {
      _instance = new Manager._internal();
    }
    return _instance;
  }
}
main() {
  // 无论如何初始化,取到的都是同一个对象
  Manager manager1 = new Manager();
  Manager manager2 = Manager.instance;
  Manager manager3 = new Manager();
  Manager manager4 = Manager.instance;
  print(identical(manager1, manager2)); //true
  print(identical(manager1, manager3)); //true
  print(identical(manager3, manager4)); //true
}
先定义类 Manager
通过定义 Manager() 方法返回一个对单例的懒加载
如果不存在则初始化如果存在则返回
因为 Dart 是单线程的语言所以其调用是线程安全的
这意味着全局有且仅有一个 _instance
懒汉模式 vs 饿汉模式
懒汉模式
类加载不创建实例
加载时速度较快
运行时获取实例速度较慢
上面的例子就是懒汉模式适用于绝大多数的场景
饿汉模式
类加载时直接进行实例的创建
加载时获取实例速度较慢
运行时速度较快
static Manager _instance = new Manager._internal();
单例使用场景
需要频繁实例化然后销毁的对象
创建对象时耗时过多或者耗资源过多但又经常用到的对象
有状态的工具类对象
频繁访问数据库或文件的对象
单例的风险
由于单例模式中没有抽象的层
因此扩展单例类是一件非常困难的事情
滥用会带来很多负面问题:
比如占用运行时资源,导致内存过限引发回收机制;
长时间不使用可能会被错误的回收,导致状态丢失等
#flutter_async_programming/Student.dart
class Student {
  String? name;
  int? age;
  //构造方法
  Student({this.name, this.age});
  // 单例方法
  static Student? _dioInstance;
  static Student instanceSingleStudent() {
    if (_dioInstance == null) {
      _dioInstance = Student();
    }
    return _dioInstance!;
  }
}
#flutter_async_programming/main.dart
import './Student.dart';
void main() {
  Student studentA = Student.instanceSingleStudent();
  studentA.name = "张三";
  Student studentB = Student.instanceSingleStudent();
  print('studentA姓名是${studentA.name}');
  print('studentB姓名是${studentB.name}');
}

factory 单例模式和flutter相关