如何使用工厂构造函数在 Dart 中实现单例模式?

Posted

技术标签:

【中文标题】如何使用工厂构造函数在 Dart 中实现单例模式?【英文标题】:How to implement Singleton pattern in Dart using factory constructors? 【发布时间】: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;
         

【问题讨论】:

【参考方案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】:

我还发现这篇文章很有帮助:https://theburningmonk.com/2013/09/dart-implementing-the-singleton-pattern-with-factory-constructors/

【讨论】:

几乎一两年前记录 Dart 的所有内容都已过时,应该被忽略。 即使是基础知识? 是的.... 大多数旧教程通常会绕过强模式,而现代 Dart 现在坚持使用它。并且库已经扩展,并且有很多 pub 发生了变化(还有很多没有在 Dart 2 更改中实现)。

以上是关于如何使用工厂构造函数在 Dart 中实现单例模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中实现单例设计模式? [复制]

在 Java 中实现单例模式的有效方法是啥? [关闭]

Dart中的类和单例模式

python中实现单例模式

线程安全在Java中实现单例模式的有效方法? [复制]

如何在 Swift 中实现单例类