Skip to content

Add Conceptual Gui Factory - abstract factory pattern. #40

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## 0.19.0
- Add "Conceptual Gui Factory" example.

## 0.18.0
- Add Memento Editor.

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down
38 changes: 38 additions & 0 deletions patterns/abstract_factory/conceptual_gui_factory/README.md
Original file line number Diff line number Diff line change
@@ -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.
```
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
abstract class Button {
void paint();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'button.dart';

class MacOSButton implements Button {
@override
void paint() {
print('You have created MacOSButton.');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'button.dart';

class WindowsButton implements Button {
@override
void paint() {
print('You have created WindowsButton.');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
abstract class Checkbox {
void paint();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'checkbox.dart';

class MacOSCheckbox implements Checkbox {
@override
void paint() {
print('You have created MacOSCheckbox.');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'checkbox.dart';

class WindowsCheckbox implements Checkbox {
@override
void paint() {
print('You have created WindowsCheckbox.');
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
@@ -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();
}
8 changes: 8 additions & 0 deletions patterns/abstract_factory/conceptual_gui_factory/main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'app/application.dart';
import 'factories/gui_factory.dart';

void main() {
final guiFactory = GUIFactory();
final app = Application(guiFactory);
app.paint();
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down