对于使用params
在dart中创建单例,我收集了以下理解class Foo extends ChangeNotifier {
late String channel;
void instanceMemberFunction () {
print('Foo created with channel $channel')
}
static final Foo _instance = Foo._internal();
Foo._internal() {
instanceMemberFunction();
}
factory Foo({
required String channel
}) {
_instance.channel = channel;
return _instance;
}
}
我像这样调用实例
Foo({channel: "bar"})
现在我想使用
Foo({channel: "baz"})
然后创建一个新实例,在这种情况下销毁旧实例是可以的。我如何在dart中实现这一点?
似乎您已经复制了一些现有的例子来创建一个单例,而没有完全理解它在做什么和为什么。核心部分为:
- 单个实例存储在全局变量或
static
变量中。 - 类有一个或多个公共
factory
构造函数,这些构造函数返回全局/static
变量,并在必要时初始化它。 - 该类的所有其他构造函数都是私有的,强制消费者通过
factory
构造函数。
因此,如果您希望您的factory
构造函数根据其参数替换其单例,您需要:
- 让
factory
构造函数检查参数是否适合现有实例。如果是,则返回现有实例。如果没有(或者没有实例),创建并返回一个新的实例。 - 由于需要检查现有实例是否已初始化,因此将其设置为空。(你也可以将它初始化为一个非空的哨兵值,例如
Foo._internal(channel: '')
。 - 将参数传递给私有构造函数。
class Foo extends ChangeNotifier {
final String channel;
void instanceMemberFunction () {
print('Foo created with channel $channel');
}
static Foo? _instance;
Foo._internal({required this.channel}) {
instanceMemberFunction();
}
factory Foo({required String channel}) {
if (channel != _instance?.channel) {
_instance = Foo._internal(channel: channel);
}
return _instance!;
}
}
注意,如果构造函数参数改变,这个实现将创建一个新的对象,这不是很像单例。根据你想做的事情,你可以:
- 返回一个新对象(可以允许多个同时实例)。
- 返回现有对象。
- 返回现有对象,但使用构造函数参数对其进行修改。