Дарт использует factory
для двух разных вещей: фабрика классы и фабрика конструкторы .Класс фабрики выглядит следующим образом:
interface List default ConcreteList {
List();
...
}
class ConcreteList implements List {
ConcreteList() {}
}
Это позволяет вам определять конструкторы в интерфейсе.Когда вы вызываете их, выполняя new List()
(или каков ваш интерфейс), он на самом деле создает экземпляр ConcreteList
, потому что это класс фабрики, который вы указали для этого интерфейса.
Это дает вам возможностьполностью инкапсулируйте конкретный тип за интерфейсом, включая даже точку построения.
Фабрика конструктор выглядит следующим образом:
class Point {
static _zero;
int x, y;
Point(this.x, this.y) {}
factory Point.zero() {
if (_zero == null) _zero = new Point(0, 0);
return _zero;
}
}
Здесь Point.zero
- это(именованный) конструктор фабрики.Фабричные конструкторы позволяют вам абстрагировать экземпляры.Вы вызываете их как обычный конструктор, но они не генерируют автоматически новый экземпляр объекта.Вместо этого вы можете делать все, что хотите, в теле конструктора.Здесь каждый раз, когда вы делаете:
new Point.zero();
Вы получите тот же кэшированный _zero
объект, даже если вы используете new
каждый раз, потому что конструктор фабрики всегда возвращаеттот самый.У них есть пара применений:
- Возврат ранее кэшированных объектов, как мы делаем здесь.
- Возврат подкласса.Это что-то вроде фабричного класса для интерфейса.У вас может быть класс, который вы можете
new
, но при определенных обстоятельствах вы можете захотеть вернуть его подкласс, чтобы специализировать его поведение.Конструкторы фабрики позволяют вам делать это без необходимости изменения места вызова.