3.8 工厂构造函数 – 《简单易懂的Dart》

3.8.1 工厂构造函数的定义

工厂构造函数是一种构造函数,与普通构造函数不同,工厂函数不会自动生成实例,而是通过代码来决定返回的实例对象.

工厂构造函数的关键字为factory,下面我们用工厂构造函数写一个只能创造一个实例的类.

class A{  
  String name;

  static A cache;

  factory A([String name='A']){
    if(A.cache===null){
      A.cache=new A.newObject(name);
    }
    return A.cache;
  }

  A.newObject(this.name);
}

void main(){  
  A a=new A('HelloWorld');
  print(a.name);

  A b=new A('HelloDart');
  print(b.name);

  print(a===b);
}

A类具有一个名为cache的静态成员,它将缓存A类的第一个实例.

在工厂构造函数A中,首先判断A.cache是否已经存在实例(即判断是否是第一次实例化),如果存在则返回缓存的实例,不存在则新建一个实例并缓存.

A.newObject是一个命名构造函数,用于创建实例.

运行这段代码,会输出

HelloWorld  
HelloWorld  
true  

其中字符串”HelloWorld”是第一个实例的name成员,在声明变量b时改用了”HelloDart”,但返回的实例的name成员仍然是”HelloWorld”.

再用===运算符判断一下它们是否属于同一个对象,结果为true,变量a和b指向的是同一个对象.

3.8.2 工厂构造函数的特性

工厂构造函数类似于static静态成员,无法访问this指针,所以在工厂构造函数中能处理的任务较为有限.

使用工厂构造函数时往往需要定义一个命名构造函数用来生产实例.