Ключевое слово factory
Ключевое слово factory используется при объявлении
конструктора класса и указывает на то, что данный
конструктор является фабричным. В отличие от обычного
конструктора, фабричный конструктор не обязан создавать
новый экземпляр класса напрямую - он может вернуть
уже существующий объект, кэшированный экземпляр или
объект другого класса. Фабричный конструктор может
принимать параметры так же, как и обычный конструктор,
и должен возвращать объект совместимого типа.
Синтаксис
class ClassName
{
factory ClassName(params)
{
// тело конструктора
return instance;
}
}
Пример
Давайте создадим класс Point с фабричным
конструктором, который возвращает один и тот же
экземпляр для одинаковых координат:
class Point
{
final int x;
final int y;
static final Map<String, Point> _cache = {};
factory Point(int x, int y)
{
String key = '$x,$y';
if (_cache.containsKey(key))
{
return _cache[key]!;
}
Point point = Point._internal(x, y);
_cache[key] = point;
return point;
}
Point._internal(this.x, this.y);
}
void main()
{
Point p1 = Point(1, 2);
Point p2 = Point(1, 2);
print(identical(p1, p2));
}
Результат выполнения кода:
true
Пример
Давайте создадим фабричный конструктор, который возвращает объект другого класса в зависимости от переданного параметра:
abstract class Shape
{
factory Shape(String type)
{
if (type == 'circle')
{
return Circle();
}
else if (type == 'square')
{
return Square();
}
throw ArgumentError('Unknown type: $type');
}
}
class Circle implements Shape
{
Circle();
}
class Square implements Shape
{
Square();
}
void main()
{
Shape shape1 = Shape('circle');
Shape shape2 = Shape('square');
print(shape1.runtimeType);
print(shape2.runtimeType);
}
Результат выполнения кода:
"Circle"
"Square"
Пример
Давайте создадим фабричный конструктор, который возвращает экземпляр класса на основе строкового представления:
class Number
{
final int value;
Number(this.value);
factory Number.fromString(String str)
{
return Number(int.parse(str));
}
}
void main()
{
Number num1 = Number(12345);
Number num2 = Number.fromString('12345');
print(num1.value);
print(num2.value);
}
Результат выполнения кода:
12345
12345
Смотрите также
-
ключевое слово
class,
которое объявляет класс -
ключевое слово
named constructor,
которое создает именованный конструктор -
ключевое слово
redirecting constructor,
которое перенаправляет вызов конструктора -
ключевое слово
static,
которое объявляет статические члены класса