Skip to content

Commit 8ef7017

Browse files
committed
Abstract Factory pattern
1 parent bdaa34d commit 8ef7017

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
11
# Design Patterns is TypeScript
2+
3+
## Catalog
4+
5+
### Creational
6+
7+
- [Abstract Factory](./src/AbstractFactory/README.md)

src/AbstractFactory/README.md

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
## Abstract Factory
2+
3+
https://refactoring.guru/ja/design-patterns/abstract-factory
4+
5+
```mermaid
6+
classDiagram
7+
class Client
8+
9+
namespace factory {
10+
class AbstractProductA {
11+
executeA()
12+
executeB()
13+
}
14+
class AbstractProductB {
15+
doAlpha()
16+
doBeta()
17+
}
18+
class AbstractFactory {
19+
createProductA()
20+
createProductB()
21+
}
22+
}
23+
namespace concretefactory {
24+
class ConcreteFactory1 {
25+
createProductA()
26+
createProductB()
27+
}
28+
class ConcreteProductA1 {
29+
executeA()
30+
executeB()
31+
}
32+
class ConcreteProductB1 {
33+
doAlpha()
34+
doBeta()
35+
}
36+
class ConcreteFactory2 {
37+
createProductA()
38+
createProductB()
39+
}
40+
class ConcreteProductA2 {
41+
executeA()
42+
executeB()
43+
}
44+
class ConcreteProductB2 {
45+
doAlpha()
46+
doBeta()
47+
}
48+
}
49+
50+
Client ..> AbstractFactory: use
51+
Client ..> AbstractProductA: use
52+
Client ..> AbstractProductB: use
53+
54+
AbstractFactory --> AbstractProductA: create
55+
AbstractFactory --> AbstractProductB: create
56+
57+
ConcreteFactory1 ..> ConcreteProductA1: create
58+
ConcreteFactory1 ..> ConcreteProductB1: create
59+
ConcreteFactory2 ..> ConcreteProductA2: create
60+
ConcreteFactory2 ..> ConcreteProductB2: create
61+
62+
ConcreteFactory1 --|> AbstractFactory
63+
ConcreteFactory2 --|> AbstractFactory
64+
ConcreteProductA1 --|> AbstractProductA
65+
ConcreteProductA2 --|> AbstractProductA
66+
ConcreteProductB1 --|> AbstractProductB
67+
ConcreteProductB2 --|> AbstractProductB
68+
```

src/AbstractFactory/index.ts

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
interface AbstractFactory {
2+
createProductA(): AbstractProductA;
3+
createProductB(): AbstractProductB;
4+
}
5+
6+
class ConcreteFactory1 implements AbstractFactory {
7+
public createProductA(): AbstractProductA {
8+
return new ConcreteProductA1();
9+
}
10+
public createProductB(): AbstractProductB {
11+
return new ConcreteProductB1();
12+
}
13+
}
14+
15+
class ConcreteFactory2 implements AbstractFactory {
16+
public createProductA(): AbstractProductA {
17+
return new ConcreteProductA2();
18+
}
19+
public createProductB(): AbstractProductB {
20+
return new ConcreteProductB2();
21+
}
22+
}
23+
24+
interface AbstractProductA {
25+
usefulFunctionA(): string;
26+
}
27+
28+
class ConcreteProductA1 implements AbstractProductA {
29+
public usefulFunctionA(): string {
30+
return 'The result of the product A1.';
31+
}
32+
}
33+
34+
class ConcreteProductA2 implements AbstractProductA {
35+
public usefulFunctionA(): string {
36+
return 'The result of the product A2.';
37+
}
38+
}
39+
40+
interface AbstractProductB {
41+
usefulFunctionB(): string;
42+
43+
anotherUsefulFunctionB(callaborator: AbstractProductA): string;
44+
}
45+
46+
class ConcreteProductB1 implements AbstractProductB {
47+
public usefulFunctionB(): string {
48+
return 'The result of the product B1.';
49+
}
50+
51+
public anotherUsefulFunctionB(collaborator: AbstractProductA): string {
52+
const result = collaborator.usefulFunctionA();
53+
return `The result of the B1 collaborating with the (${result})`;
54+
}
55+
}
56+
57+
class ConcreteProductB2 implements AbstractProductB {
58+
public usefulFunctionB(): string {
59+
return 'The result of the product B2.';
60+
}
61+
62+
public anotherUsefulFunctionB(collaborator: AbstractProductA): string {
63+
const result = collaborator.usefulFunctionA();
64+
return `The result of the B2 collaborating with the (${result})`;
65+
}
66+
}
67+
68+
function clientCode(factory: AbstractFactory) {
69+
const productA = factory.createProductA();
70+
const productB = factory.createProductB();
71+
72+
console.log(productB.usefulFunctionB());
73+
console.log(productB.anotherUsefulFunctionB(productA));
74+
}
75+
76+
console.log('Client: Testing client code with the first factory type...');
77+
clientCode(new ConcreteFactory1());
78+
79+
console.log('');
80+
81+
console.log('Client: Testing the same client code with the second factory type...');
82+
clientCode(new ConcreteFactory2());

0 commit comments

Comments
 (0)