diff --git a/CHANGELOG.md b/CHANGELOG.md index da7fd45..dfbae0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.34.0 +- Add conceptual single pattern. + ## 0.33.0 - Add conceptual builder pattern. diff --git a/README.md b/README.md index e49cdba..731449f 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ It contains **Dart** examples for all classic **GoF** design patterns. - [x] **Builder** - [[Conceptual](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/builder/conceptual)] [[Color Text Format](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/builder/color_text_format)] - [x] **Factory Method** [[Conceptual Platform Dialog](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/factory_method/conceptual_platform_dialog)] - [x] **Prototype** - [[Shapes](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/prototype/shapes)] - - [ ] **Singleton** + - [x] **Singleton** - [[Conceptual](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/singleton/conceptual)] - [ ] **Behavioral** - [x] **Chain of Responsibility** - [[Server Middleware](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/chain_of_responsibility/server_middleware)] - [x] **Command** - [[Text Editor](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/command/text_editor)] diff --git a/patterns/singleton/conceptual/README.md b/patterns/singleton/conceptual/README.md new file mode 100644 index 0000000..5876387 --- /dev/null +++ b/patterns/singleton/conceptual/README.md @@ -0,0 +1,28 @@ +# Singleton Pattern +Singleton is a creational design pattern that lets you ensure that a class has only one instance, +while providing a global access point to this instance. + +Tutorial: [here](https://refactoring.guru/design-patterns/singleton). + +### Diagram: +![Singleton Pattern Diagram](https://user-images.githubusercontent.com/8049534/182938119-78a21534-5751-4dea-afa3-8acaec46eed9.png) + +### Client code: +```dart +void main() { + // dart style + Singleton().doSome(); + Singleton().doSome(); + + // standard style + Singleton.instance.doSome(); +} +``` + +### Output: +``` +Create singleton once. +doSome() +doSome() +doSome() +``` diff --git a/patterns/singleton/conceptual/main.dart b/patterns/singleton/conceptual/main.dart new file mode 100644 index 0000000..e54f386 --- /dev/null +++ b/patterns/singleton/conceptual/main.dart @@ -0,0 +1,10 @@ +import 'pattern/singleton.dart'; + +void main() { + // dart style + Singleton().doSome(); + Singleton().doSome(); + + // standard style + Singleton.instance.doSome(); +} diff --git a/patterns/singleton/conceptual/pattern/singleton.dart b/patterns/singleton/conceptual/pattern/singleton.dart new file mode 100644 index 0000000..7096950 --- /dev/null +++ b/patterns/singleton/conceptual/pattern/singleton.dart @@ -0,0 +1,23 @@ +abstract class Singleton { + factory Singleton() { + if (_instance == null) { + print('Create singleton once.'); + _instance = ConcreteSingleton(); + } + + return _instance!; + } + + static Singleton get instance => Singleton(); + + void doSome(); + + static Singleton? _instance; +} + +class ConcreteSingleton implements Singleton { + @override + void doSome() { + print('doSome()'); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 3975345..d1607a0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: design_patterns_dart description: Dart examples for all classic GoF design patterns. -version: 0.33.0 +version: 0.34.0 homepage: https://refactoring.guru/design-patterns repository: https://github.com/RefactoringGuru/design-patterns-dart issue_tracker: https://github.com/RefactoringGuru/design-patterns-dart/issue