Я недавно столкнулся с некоторыми примерами, которые используют абстрактные классы в качестве интерфейсов, но также добавляют заводские конструкторы к абстрактному интерфейсу, чтобы он мог в некотором смысле быть «новым». Например:Преимущества абстрактного класса с заводским конструктором?
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, который обычно выдает предупреждение от анализатора Дарта, и указанная служебная переменная фактически является экземпляром ConcreateWidgetService на основе назначения ConcreateWidgetService для фабричного конструктора WidgetService.
Есть ли преимущества для такого подхода? Из моего опыта ООП я использовал абстрактные классы/интерфейсы для программирования, когда я не знал конкретного типа, который мне дадут. Здесь кажется, что мы сразу назначаем конкретный тип абстрактному заводскому конструктору. Думаю, мой второй вопрос будет в этом случае, почему бы просто не использовать ConcreteWidgetService прямо здесь, а не повторять все подписи метода?