gpt4 book ai didi

oop - 带有工厂构造函数的抽象类的好处?

转载 作者:行者123 更新时间:2023-12-01 09:50:36 25 4
gpt4 key购买 nike

我最近遇到了一些使用抽象类作为接口(interface)但也将工厂构造函数添加到抽象接口(interface)的示例,因此它在某种意义上可以“更新”。例如:

abstract class WidgetService {
factory WidgetService() = ConcreteWidgetService;

Widget getWidget();
void saveWidget(Widget widget);
}

class ConcreteWidgetService extends BaseWidgetService implements WidgetService {

WidgetService();

Widget getWidget() {
// code to get widget here
}

void saveWidget(Widget widget) {
// code to save widget here
}
}

此服务的用法将在其他一些服务或组件中,如下所示:
WidgetService _service = new WidgetService();

根据我对这个示例的理解,上面的行基本上会“新建”一个 WidgetService,这通常会从 Dart 分析器产生警告,并且所述服务变量实际上是基于 ConcreateWidgetService 分配给WidgetService 的工厂构造函数。

这种方法有好处吗?根据我的 OOP 经验,当我不知道我将获得的具体类型时,我使用抽象类/接口(interface)进行编程。在这里,我们似乎将具体类型立即分配给抽象工厂构造函数。我想我的第二个问题是在这种情况下为什么不直接在这里使用 ConcreteWidgetService 而不是重复所有方法签名?

最佳答案

在您的示例中,好处是有限的,但在更复杂的情况下,好处变得更加明显。
工厂构造函数允许您更好地控制构造函数返回的内容。它可以返回子类的实例或已经存在的(缓存的)实例。
它可以根据构造函数参数返回不同的具体实现:

abstract class WidgetService {
WidgetService _cached;

factory WidgetService(String type) {
switch (type) {
case 'a':
return ConcreteWidgetServiceA();
case 'b':
return ConcreteWidgetServiceB();
default:
return _cached ??= DummyWidgetServiceA();
}
}

Widget getWidget();

void saveWidget(Widget widget);
}
您的示例似乎是最终扩展到这种更灵活的方法的准备。

关于oop - 带有工厂构造函数的抽象类的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38707327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com