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 用法的主要内容,如果未能解决你的问题,请参考以下文章