Фабричный конструктор в Dart
Фабричный конструктор помечают словом factory.
Он может вернуть новый объект, уже существующий экземпляр
или значение подтипа. В теле используют только return -
без списка инициализации и без this. Часто основной
конструктор делают приватным, а снаружи оставляют
понятные фабрики:
class Post {
String title;
Post._(this.title);
factory Post.fromHome() {
return Post._("/home/app/note.txt");
}
factory Post.fromTemp() {
return Post._("/tmp/note.txt");
}
}
Создадим объект и выведем его:
var post = Post.fromHome();
print(post.title);
Запись Post.fromHome() читается как именованный
способ получить объект. Приватный Post._ виден
только в этом файле, поэтому создать запись иначе
снаружи нельзя.
Фабрика может проверять аргументы и при пустой строке вернуть заранее подготовленный вариант:
class Post {
String title;
Post._(this.title);
factory Post.parseTitle(String raw) {
var text = raw.trim();
if (text.isEmpty) {
return Post._("draft");
}
return Post._(text);
}
}
Создадим объект и выведем его:
print(Post.parseTitle(" note ").title);
print(Post.parseTitle(" ").title);
Фабрика удобна и для коротких сценариев без отдельного типа. Именованный фабричный конструктор может вызвать другой конструктор того же класса:
class Post {
String title;
Post(this.title);
Post.empty() : title = "draft";
factory Post.draft() {
return Post.empty();
}
}
Создадим объект и выведем его:
var post = Post.draft();
print(post.title);
Сделайте класс Employee с приватным конструктором
и полем label типа String. Добавьте
фабрики v1 и v2 со строками "1.0"
и "2.0". Выведите текст из результата
Employee.v2().
Сделайте класс Employee с приватным конструктором
и полями from и to типа int.
Добавьте фабрику of с двумя аргументами,
которая записывает меньшее значение в from.
Выведите Employee.of(10, 3).from.