Dart 中 factory 用法

Posted 杨斌并

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart 中 factory 用法相关的知识,希望对你有一定的参考价值。

Dart 中 factory 用法

Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class. For example, a factory constructor might return an instance from a cache, or it might return an instance of a subtype.
当你使用factory关键词时,你能控制在使用构造函数时,并不总是创建一个新的该类的对象,比如它可能会从缓存中返回一个已有的实例,或者是返回子类的实例。

  • 与构造函数的差别

构造函数不能有返回值,而factory必须有

  • 3个使用场景
    • 避免创建过多的重复实例,如果已创建该实例,则从缓存中拿出来。

    • 调用子类的构造函数(工厂模式 factory pattern)

    • 实现单例模式

//避免创建过多的重复实例,如果已创建该实例,则从缓存中拿出来。
class Logger 
  static final Map<String, Logger> _cache = <String, Logger>;
  final String name;

  factory Logger(String name) 
    return _cache.putIfAbsent(name, () => Logger._internal(name));
  

  Logger._internal(this.name)
    print("创建了新的对象");
  

  void log(String msg) 
    print(msg);
  



var logger = Logger("aa");
var logger2 = Logger("aa");

//这两对象是同一个

//调用子类的构造函数(工厂模式 factory pattern)
abstract class Phone 
  late String name;
  factory Phone(String type, String name) 
    if (type == "android") 
      return AndroidPhone.internal(name);
     else 
      return ApplePhone.internal(name);
    
  

  static final Map<String, Phone> _map= ;


class AndroidPhone implements Phone 
  @override
  String name;

  AndroidPhone.internal(this.name)
    print("创建了 $name");
  


class ApplePhone implements Phone 
  @override
  String name;

  ApplePhone.internal(this.name)
    print("创建了 $name");
  



//调用
    Phone p = Phone("android", "android");
    Phone p2 = Phone("ios", "ios");
    Phone p3 = Phone("android", "android");

    print(identical(p, p3));
    
// 打印
2023-03-14 03:35:47.247  3779-3916  flutter                 com.example.untitled                 I  创建了 android
2023-03-14 03:35:47.247  3779-3916  flutter                 com.example.untitled                 I  创建了 ios
2023-03-14 03:35:47.248  3779-3916  flutter                 com.example.untitled                 I  创建了 android
2023-03-14 03:35:47.248  3779-3916  flutter                 com.example.untitled                 I  false

//都是新的对象

  • 改造 上面的 Phone 类
abstract class Phone 
  static final Map<String, Phone> _map= ;
  late String name;
  factory Phone(String type, String name) 
    if (type == "android") 
      return _map.putIfAbsent(type, () => AndroidPhone.internal(name));
     else 
      return _map.putIfAbsent(type, () => ApplePhone.internal(name));
    
  


//打印
2023-03-14 03:40:01.503  3779-3916  flutter                 com.example.untitled                 I  创建了 android
2023-03-14 03:40:01.504  3779-3916  flutter                 com.example.untitled                 I  创建了 ios
2023-03-14 03:40:01.504  3779-3916  flutter                 com.example.untitled                 I  true

//两对象是同一个
//单例
class Singleton 
  static final Singleton _singleton = Singleton._internal();

  Singleton._internal() 
    print("创建了Singleton新的对象");
  

  factory Singleton() 
    return _singleton;
  

以上是关于Dart 中 factory 用法的主要内容,如果未能解决你的问题,请参考以下文章

Dart List 用法小结

Flutter Widgets 之 SnackBar

dart中extends implementswith的用法与区别

Flutter入门Dart语言:控制流语句的基本用法

Task.Factory.StartNew的用法

Dart Metadata 使用