flutter中如何使用factory构造函数

在Flutter开发中遇到一个问题:factory构造函数的使用场景和普通构造函数有什么区别?具体该如何正确使用factory构造函数?比如我想根据不同的条件返回缓存的实例或新建实例,这种情况下factory构造函数该怎么实现?能否提供一个具体的代码示例来说明?

2 回复

在Flutter中,使用factory构造函数可以返回类的实例,而不必每次都创建新对象。常用于单例模式或从缓存返回实例。示例:

class MyClass {
  static MyClass _instance;
  factory MyClass() => _instance ??= MyClass._();
  MyClass._();
}

更多关于flutter中如何使用factory构造函数的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter/Dart 中,factory 构造函数是一种特殊的构造函数,它不总是创建类的新实例,而是可以返回缓存实例、子类实例或执行其他逻辑。

基本语法:

class ClassName {
  factory ClassName() {
    // 构造逻辑
    return instance;
  }
}

常见使用场景和示例:

  1. 返回缓存实例(单例模式)
class Logger {
  static Logger? _instance;
  
  Logger._internal(); // 私有命名构造函数
  
  factory Logger() {
    _instance ??= Logger._internal(); // 如果为空则创建新实例
    return _instance!;
  }
  
  void log(String msg) => print(msg);
}

// 使用
final logger = Logger();
logger.log('Hello World');
  1. 根据参数返回不同子类实例
abstract class Animal {
  String makeSound();
  
  factory Animal(String type) {
    switch (type) {
      case 'dog':
        return Dog();
      case 'cat':
        return Cat();
      default:
        throw ArgumentError('Unknown animal type');
    }
  }
}

class Dog implements Animal {
  @override
  String makeSound() => 'Woof!';
}

class Cat implements Animal {
  @override
  String makeSound() => 'Meow!';
}

// 使用
Animal dog = Animal('dog');
print(dog.makeSound()); // 输出: Woof!
  1. 从缓存映射中返回实例
class Person {
  final String id;
  final String name;
  
  static final Map<String, Person> _cache = {};
  
  Person._create(this.id, this.name);
  
  factory Person(String id, String name) {
    return _cache.putIfAbsent(id, () => Person._create(id, name));
  }
}

关键特点:

  • 使用 factory 关键字声明
  • 可以返回已有实例,不一定是新实例
  • 不能访问 this
  • 常用于实现设计模式(如单例、工厂模式)
  • 比静态方法更语义化,明确表示这是在创建对象

注意事项:

  • 确保返回类型与类本身或其子类兼容
  • 考虑线程安全(在并发环境中)
  • 避免过于复杂的逻辑,保持构造函数的清晰性
回到顶部