首页 > 解决方案 > 为什么我应该将返回的工厂实例设为静态字段?

问题描述

创建返回类实例的函数是对的,但是创建返回类实例的工厂应该是静态字段。为什么我应该将返回的工厂实例设为静态字段?

代码是:

class DBHelper{
  DBHelper._();
  factory DBHelper()=>instance; // ->> cursor error
   // static
  // final  
  DBHelper instance=DBHelper._();
  int number=2;
  int fun()=>number;
}

标签: flutterfactory

解决方案


我认为您并没有完全理解工厂方法的目的。您发布的示例是在 dart/flutter 中使用单例模式的方式。在我看来,这是创建单例类的最干净的方式。

现在可以使用工厂方法来简化对象的构造,并且它们根本不需要返回静态字段。这里有一些例子:

class OneObject {
  final int one;
  final String two;
  final double three;

  OneObject(this.one, this.two, this.three);
  
  factory OneObject.withoudTwo(int one, double three) {
    return OneObject(one, "2", three);
  }
  
  factory OneObject.fromJson(Map<String, dynamic> aMap) {
    return OneObject(aMap["one"], aMap["two"], aMap["three"]); // this is bad use of json parsing
  }
}

在您的情况下,这DBHelper._();是该类的实际构造函数,并且将_其设为私有,这允许您创建一个名为的工厂方法DBHelper.();

为了详细说明答案,工厂方法类似于静态方法,静态方法不能访问声明它们的类的实例成员,它们只能访问静态成员。在您的示例中,instance只有在创建 DbHelper 的新实例时才会创建属性(没有静态),因此,从工厂方法返回它是不可能的,因为它还不可用。


推荐阅读