Skip to content

Commit c46cc84

Browse files
authored
Merge pull request #71 from ilopX/add-conceptual-builder-pattern
Add conceptual builder pattern
2 parents 73e5194 + 5d0e223 commit c46cc84

File tree

12 files changed

+164
-2
lines changed

12 files changed

+164
-2
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 0.33.0
2+
- Add conceptual builder pattern.
3+
14
## 0.32.0
25
- Add conceptual interpreter pattern.
36

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ It contains **Dart** examples for all classic **GoF** design patterns.
55
# Implementation checklist:
66
- [ ] **Creation**
77
- [x] **Abstract Factory** [[Conceptual Gui Factory](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/abstract_factory/conceptual_gui_factory)] [[![16x16](https://user-images.githubusercontent.com/8049534/171852337-57db0faf-1f5e-489a-a79a-22ed4f47b4ed.png) Tool Panel Factory](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/abstract_factory/tool_panel_factory)]
8-
- [x] **Builder** - [[Color Text Format](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/builder/color_text_format)]
8+
- [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)]
99
- [x] **Factory Method** [[Conceptual Platform Dialog](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/factory_method/conceptual_platform_dialog)]
1010
- [x] **Prototype** - [[Shapes](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/prototype/shapes)]
1111
- [ ] **Singleton**
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Builder Pattern
2+
Builder is a creational design pattern that lets you construct complex objects step by step. The
3+
pattern allows you to produce different types and representations of an object using the same
4+
construction code.
5+
6+
## Diagram:
7+
8+
![image](https://user-images.githubusercontent.com/8049534/182850365-52969fc7-d743-430b-acc7-da400eae26aa.png)
9+
10+
## Client code:
11+
12+
```dart
13+
void main() {
14+
final director = Director();
15+
16+
final product1 = director.construct(ConcreteBuilder1());
17+
print(product1);
18+
19+
final product2 = director.construct(ConcreteBuilder2());
20+
print(product2);
21+
}
22+
```
23+
24+
### Output:
25+
26+
```
27+
ConcreteBuilder1
28+
001: one
29+
002: two
30+
003: three
31+
32+
ConcreteBuilder2
33+
1️⃣: first
34+
2️⃣: second
35+
3️⃣: third
36+
```
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import '../pattern/builder.dart';
2+
import '../pattern/product.dart';
3+
import '../product/concrete_product_1.dart';
4+
5+
class ConcreteBuilder1 implements Builder {
6+
@override
7+
void buildPart1() {
8+
_product.addLine('one');
9+
}
10+
11+
@override
12+
void buildPart2() {
13+
_product.addLine('two');
14+
}
15+
16+
@override
17+
void buildPart3() {
18+
_product.addLine('three');
19+
}
20+
21+
@override
22+
Product get result => _product;
23+
24+
final _product = ConcreteProduct1('ConcreteBuilder1');
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import '../pattern/builder.dart';
2+
import '../pattern/product.dart';
3+
import '../product/concrete_product_2.dart';
4+
5+
class ConcreteBuilder2 implements Builder {
6+
@override
7+
void buildPart1() {
8+
_product.addLine('first');
9+
}
10+
11+
@override
12+
void buildPart2() {
13+
_product.addLine('second');
14+
}
15+
16+
@override
17+
void buildPart3() {
18+
_product.addLine('third');
19+
}
20+
21+
@override
22+
Product get result => _product;
23+
24+
final _product = ConcreteProduct2('ConcreteBuilder2');
25+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import 'concrete_builder/concrete_builder_1.dart';
2+
import 'concrete_builder/concrete_builder_2.dart';
3+
import 'pattern/director.dart';
4+
5+
void main() {
6+
final director = Director();
7+
8+
final product1 = director.construct(ConcreteBuilder1());
9+
print(product1);
10+
11+
final product2 = director.construct(ConcreteBuilder2());
12+
print(product2);
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import 'product.dart';
2+
3+
abstract class Builder {
4+
void buildPart1();
5+
void buildPart2();
6+
void buildPart3();
7+
8+
Product get result;
9+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'builder.dart';
2+
import 'product.dart';
3+
4+
class Director {
5+
Product construct(Builder builder) {
6+
builder.buildPart1();
7+
builder.buildPart2();
8+
builder.buildPart3();
9+
10+
return builder.result;
11+
}
12+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
abstract class Product {}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import '../pattern/product.dart';
2+
3+
class ConcreteProduct1 implements Product {
4+
ConcreteProduct1(String name) {
5+
_buff.add(name);
6+
}
7+
8+
void addLine(String name) {
9+
final index = _buff.length.toString().padLeft(3, '0');
10+
_buff.add('$index: $name');
11+
}
12+
13+
@override
14+
String toString() {
15+
return '${_buff.join('\n')}\n';
16+
}
17+
18+
final _buff = <String>[];
19+
}

0 commit comments

Comments
 (0)