Last active
September 2, 2022 01:40
-
-
Save theburningmonk/6401183 to your computer and use it in GitHub Desktop.
Using Dart's factory constructor feature to implement the singleton pattern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class MyClass { | |
static final MyClass _singleton = new MyClass._internal(); | |
factory MyClass() { | |
return _singleton; | |
} | |
MyClass._internal() { | |
... // initialization logic here | |
} | |
... // rest of the class | |
} | |
// consuming code | |
MyClass myObj = new MyClass(); // get back the singleton | |
... | |
// another piece of consuming code | |
MyClass myObj = new MyClass(); // still getting back the singleton |
Singleton design pattern is intended to create one and only one (single) instance of a class.
If you wanted a single instance with a parameter, how would you do that?
Do you see any issue in this code?
class MyClass {
MyClass._(this.parameter);
final String parameter;
static MyClass? _instance;
static void initialize(String parameter) {
_instance = MyClass._(parameter );
}
static MyClass get instance => _instance!; // throw an "initialize first" error
// access parameter
}
Singleton design pattern is intended to create one and only one (single) instance of a class.
If you wanted a single instance with a parameter, how would you do that?
Do you see any issue in this code?
This is not a singleton implementation.
See this for reference: Dart Null-Safty Singleton with parameters
Can MyClass extend an abstract class with non-null constructor? If so how?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The pattern proposed by @theburningmonk actually has a problem.
I just spent twenty minutes chasing down a bug which this pattern obscured.
The problem was that my _internal method was throwing an exception.
In the exception handler I was trying to reference the same factory instance. This caused an npe as _singleton was null (due to the _internal exception) so I got an npe rather than the original exception.
The following pattern avoids this issue:
The only disadvantage is that _singleton can no longer be final.