РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
102 of 723 menu

Ключевое слово 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,
    которое объявляет статические члены класса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить