diff --git a/CHANGELOG.md b/CHANGELOG.md index 21d69b6..d340572 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.19.0 +- Add "Conceptual Gui Factory" example. + ## 0.18.0 - Add Memento Editor. diff --git a/README.md b/README.md index b4fe095..c941ef6 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ It contains **Dart** examples for all classic **GoF** design patterns. # Implementation checklist: - [ ] **Creation** - - [ ] **Abstract Factory** + - [ ] **Abstract Factory** [[Conceptual Gui Factory](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/abstract_factory/conceptual_gui_factory)] - [x] **Builder** - [[Color Text Format](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/builder/color_text_format)] - [ ] **Factory Method** - [x] **Prototype**] - [[Shapes](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/prototype/shapes)] diff --git a/patterns/abstract_factory/conceptual_gui_factory/README.md b/patterns/abstract_factory/conceptual_gui_factory/README.md new file mode 100644 index 0000000..9454266 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/README.md @@ -0,0 +1,38 @@ +# Abstract Factory pattern +Abstract Factory is a creational design pattern that lets you produce families of related objects +without specifying their concrete classes. + +Tutorial: [here](https://refactoring.guru/design-patterns/abstract-factory). + +### About example. +This the very conceptual example rewrite from original source code [java example](https://github.com/RefactoringGuru/design-patterns-java/tree/main/src/refactoring_guru/abstract_factory/example) + +### Diagram: +![image](https://user-images.githubusercontent.com/8049534/165987890-e64db9a3-4865-411c-a5c0-16da21043159.png) + +### Client code: +```dart +void main() { + final guiFactory = GUIFactory(); + final app = Application(guiFactory); + app.paint(); +} + +abstract class GUIFactory { + factory GUIFactory() { + if (Platform.isMacOS) { + return MacOSFactory(); + } else { + return WindowsFactory(); + } + } + + /*...*/ +} +``` + +### Output: +``` +You have created WindowsButton. +You have created WindowsCheckbox. +``` diff --git a/patterns/abstract_factory/conceptual_gui_factory/app/application.dart b/patterns/abstract_factory/conceptual_gui_factory/app/application.dart new file mode 100644 index 0000000..a14e494 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/app/application.dart @@ -0,0 +1,18 @@ +import '../button/button.dart'; +import '../checkbox/checkbox.dart'; +import '../factories/gui_factory.dart'; + +class Application { + late Button _button; + late Checkbox _checkbox; + + Application(GUIFactory factory) { + _button = factory.createButton(); + _checkbox = factory.createCheckbox(); + } + + void paint() { + _button.paint(); + _checkbox.paint(); + } +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/button/button.dart b/patterns/abstract_factory/conceptual_gui_factory/button/button.dart new file mode 100644 index 0000000..ccf3c96 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/button/button.dart @@ -0,0 +1,3 @@ +abstract class Button { + void paint(); +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/button/mac_os_button.dart b/patterns/abstract_factory/conceptual_gui_factory/button/mac_os_button.dart new file mode 100644 index 0000000..d84c7a5 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/button/mac_os_button.dart @@ -0,0 +1,8 @@ +import 'button.dart'; + +class MacOSButton implements Button { + @override + void paint() { + print('You have created MacOSButton.'); + } +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/button/windows_button.dart b/patterns/abstract_factory/conceptual_gui_factory/button/windows_button.dart new file mode 100644 index 0000000..790345a --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/button/windows_button.dart @@ -0,0 +1,8 @@ +import 'button.dart'; + +class WindowsButton implements Button { + @override + void paint() { + print('You have created WindowsButton.'); + } +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/checkbox/checkbox.dart b/patterns/abstract_factory/conceptual_gui_factory/checkbox/checkbox.dart new file mode 100644 index 0000000..caaf517 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/checkbox/checkbox.dart @@ -0,0 +1,3 @@ +abstract class Checkbox { + void paint(); +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/checkbox/mac_os_checkbox.dart b/patterns/abstract_factory/conceptual_gui_factory/checkbox/mac_os_checkbox.dart new file mode 100644 index 0000000..26cacfd --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/checkbox/mac_os_checkbox.dart @@ -0,0 +1,8 @@ +import 'checkbox.dart'; + +class MacOSCheckbox implements Checkbox { + @override + void paint() { + print('You have created MacOSCheckbox.'); + } +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/checkbox/windows_checkbox.dart b/patterns/abstract_factory/conceptual_gui_factory/checkbox/windows_checkbox.dart new file mode 100644 index 0000000..0fa6755 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/checkbox/windows_checkbox.dart @@ -0,0 +1,8 @@ +import 'checkbox.dart'; + +class WindowsCheckbox implements Checkbox { + @override + void paint() { + print('You have created WindowsCheckbox.'); + } +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/factories/gui_factory.dart b/patterns/abstract_factory/conceptual_gui_factory/factories/gui_factory.dart new file mode 100644 index 0000000..fca44e2 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/factories/gui_factory.dart @@ -0,0 +1,20 @@ +import 'dart:io'; + +import '../button/button.dart'; +import '../checkbox/checkbox.dart'; +import 'mac_os_factory.dart'; +import 'window_factory.dart'; + +abstract class GUIFactory { + factory GUIFactory() { + if (Platform.isMacOS) { + return MacOSFactory(); + } else { + return WindowsFactory(); + } + } + + Button createButton(); + + Checkbox createCheckbox(); +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/factories/mac_os_factory.dart b/patterns/abstract_factory/conceptual_gui_factory/factories/mac_os_factory.dart new file mode 100644 index 0000000..d49f919 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/factories/mac_os_factory.dart @@ -0,0 +1,13 @@ +import '../button/button.dart'; +import '../checkbox/checkbox.dart'; +import '../button/mac_os_button.dart'; +import '../checkbox/mac_os_checkbox.dart'; +import 'gui_factory.dart'; + +class MacOSFactory implements GUIFactory { + @override + Button createButton() => MacOSButton(); + + @override + Checkbox createCheckbox() => MacOSCheckbox(); +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/factories/window_factory.dart b/patterns/abstract_factory/conceptual_gui_factory/factories/window_factory.dart new file mode 100644 index 0000000..7592f86 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/factories/window_factory.dart @@ -0,0 +1,13 @@ +import '../button/button.dart'; +import '../checkbox/checkbox.dart'; +import '../button/windows_button.dart'; +import '../checkbox/windows_checkbox.dart'; +import 'gui_factory.dart'; + +class WindowsFactory implements GUIFactory { + @override + Button createButton() => WindowsButton(); + + @override + Checkbox createCheckbox() => WindowsCheckbox(); +} diff --git a/patterns/abstract_factory/conceptual_gui_factory/main.dart b/patterns/abstract_factory/conceptual_gui_factory/main.dart new file mode 100644 index 0000000..b946056 --- /dev/null +++ b/patterns/abstract_factory/conceptual_gui_factory/main.dart @@ -0,0 +1,8 @@ +import 'app/application.dart'; +import 'factories/gui_factory.dart'; + +void main() { + final guiFactory = GUIFactory(); + final app = Application(guiFactory); + app.paint(); +} diff --git a/pubspec.yaml b/pubspec.yaml index bfc44e3..5939bdb 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.18.9 +version: 0.19.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