【问题标题】:How to implement Singleton pattern in Dart using factory constructors?如何使用工厂构造函数在 Dart 中实现单例模式?
【发布时间】:2019-05-26 03:15:48
【问题描述】:

我正在尝试在数据库帮助程序类中实现单例模式,但是,我似乎无法理解工厂构造函数的目的以及是否有使用它的替代方法。

class DbHelper {

         final String tblName ='';
         final String clmnName ='';
         final String clmnPass='';

         DbHelper._constr();
         static final DbHelper _db = new DbHelper._constr();

         factory DbHelper(){ return _db;}  

         Database _mydb;
         Future<Database> get mydb async{

         initDb() {
          if(_mydb != null)
          {
              return _mydb;
          }
          _mydb = await  initDb();
          return _mydb;
         }

【问题讨论】:

    标签: constructor dart singleton factory factory-pattern


    【解决方案1】:

    不需要使用工厂构造函数。 当new 还不是可选的时,工厂构造函数很方便,因为它new MyClass() 适用于构造函数每次返回新实例或类返回缓存实例的类。知道对象的实际创建方式和时间不是调用者的责任。

    你可以改变

    factory DbHelper(){ return _db;} 
    

    DbHelper get singleton { return _db;}   
    

    并使用获取实例

    var mySingletonReference = DbHelper.singleton;
    

    而不是

    var mySingletonReference = DbHelper();
    

    这只是一个偏好问题。

    【讨论】:

    • 所以它要么使用静态单例属性,要么使用工厂模式。对吗?
    • 您还可以将static final DbHelper _db = new DbHelper._constr(); 更改为static final DbHelper singleton = new DbHelper._constr(); 并删除我在回答中建议的singleton getter。这取决于您的用例。如果您需要其他配置值来创建实例,您可能无法使用字段初始值设定项。不过,在您的示例中就足够了。
    • 我不太明白。一个完整的例子(或一个链接)会非常有帮助。我也不明白用例是如何影响它的。
    • 你说的是this吗?所以这只是一个偏好问题?两者效果一样吗?
    • 是的,这只是一个偏好问题。
    【解决方案2】:

    【讨论】:

    • 几乎一两年前记录 Dart 的所有内容都已过时,应该被忽略。
    • 即使是基础知识?
    • 是的.... 大多数旧教程通常会绕过强模式,而现代 Dart 现在坚持使用它。并且库已经扩展,并且有很多 pub 发生了变化(还有很多没有在 Dart 2 更改中实现)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多