如何使用工厂构造函数在 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 中实现单例模式?的主要内容,如果未能解决你的问题,请参考以下文章