Skip to content

Commit 20dfa02

Browse files
committed
Builder pattern
1 parent 8ef7017 commit 20dfa02

File tree

4 files changed

+129
-0
lines changed

4 files changed

+129
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
### Creational
66

77
- [Abstract Factory](./src/AbstractFactory/README.md)
8+
- [Builder](./src/Builder/README.md)

src/AbstractFactory/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
export {};
2+
13
interface AbstractFactory {
24
createProductA(): AbstractProductA;
35
createProductB(): AbstractProductB;

src/Builder/README.md

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
## Builder
2+
3+
https://refactoring.guru/ja/design-patterns/builder
4+
5+
```mermaid
6+
classDiagram
7+
class Client
8+
9+
class Director {
10+
builder
11+
construct()
12+
}
13+
14+
class Builder {
15+
<<Interface>>
16+
buildPart1()
17+
buildPart2()
18+
buildPart3()
19+
}
20+
21+
class ConcreteBuilder1 {
22+
buildPart1()
23+
buildPart2()
24+
buildPart3()
25+
getResult()
26+
}
27+
28+
class ConcreteBuilder2 {
29+
buildPart1()
30+
buildPart2()
31+
buildPart3()
32+
getResult()
33+
}
34+
35+
ConcreteBuilder1 ..|> Builder
36+
ConcreteBuilder2 ..|> Builder
37+
38+
Director ..> Builder
39+
40+
Client ..> Director: use
41+
Client ..> ConcreteBuilder1: use
42+
Client ..> ConcreteBuilder2: use
43+
```

src/Builder/index.ts

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
export {};
2+
3+
interface Builder {
4+
producePartA(): void;
5+
producePartB(): void;
6+
producePartC(): void;
7+
}
8+
9+
class ConcreteBuilder1 implements Builder {
10+
private product: Product1;
11+
12+
constructor() {
13+
this.product = new Product1();
14+
}
15+
16+
public reset(): void {
17+
this.product = new Product1();
18+
}
19+
20+
public producePartA(): void {
21+
this.product.parts.push('PartA1');
22+
}
23+
24+
public producePartB(): void {
25+
this.product.parts.push('PartB1');
26+
}
27+
28+
public producePartC(): void {
29+
this.product.parts.push('PartC1');
30+
}
31+
32+
public getProduct(): Product1 {
33+
const result = this.product;
34+
this.reset();
35+
return result;
36+
}
37+
}
38+
39+
class Product1 {
40+
public parts: string[] = [];
41+
42+
public listParts(): void {
43+
console.log(`Product parts: ${this.parts.join(', ')}\n`);
44+
}
45+
}
46+
47+
class Director {
48+
private builder: Builder;
49+
50+
constructor(builder: Builder) {
51+
this.builder = builder;
52+
}
53+
54+
public buildMinimalViableProduct(): void {
55+
this.builder.producePartA();
56+
}
57+
58+
public buildFullFeaturedProduct(): void {
59+
this.builder.producePartA();
60+
this.builder.producePartB();
61+
this.builder.producePartC();
62+
}
63+
}
64+
65+
function clientCode() {
66+
const builder = new ConcreteBuilder1();
67+
const director = new Director(builder);
68+
69+
console.log('Standard basic product:');
70+
director.buildMinimalViableProduct();
71+
builder.getProduct().listParts();
72+
73+
console.log('Standard full featured product:');
74+
director.buildFullFeaturedProduct();
75+
builder.getProduct().listParts();
76+
77+
console.log('Custom product:');
78+
builder.producePartA();
79+
builder.producePartC();
80+
builder.getProduct().listParts();
81+
}
82+
83+
clientCode();

0 commit comments

Comments
 (0)