Builders Academy
Design Patterns — Les Patterns GoF Essentiels
1 of 2

Chapitre 1 · Leçon 1

Factory Pattern

Déléguer la création d'objets

Section 1

Factory Method

Step 1

Factory Method — créer sans savoir le type exact

Factory Method : définir une interface pour créer un objet, mais laisser les sous-classes décider quelle classe instancier.

snippet.typescript

typescript
1// Problème : créer des parsers selon le format
2// Sans Factory :
3function parseContent(content: string, format: string) {
4  if (format === 'json') return JSON.parse(content);
5  if (format === 'yaml') return parseYaml(content);
6  if (format === 'xml') return parseXml(content);
7  throw new Error(`Format inconnu: ${format}`);
8}
9// Chaque nouveau format = modifier cette fonction
10
11// Avec Factory Method :
12interface ContentParser {
13  parse(content: string): unknown;
14  stringify(data: unknown): string;
15}
16
17class JsonParser implements ContentParser {
18  parse(content: string): unknown { return JSON.parse(content); }
19  stringify(data: unknown): string { return JSON.stringify(data, null, 2); }
20}
21
22class YamlParser implements ContentParser {
23  parse(content: string): unknown { return parseYaml(content); }
24  stringify(data: unknown): string { return stringifyYaml(data); }
25}
26
27// Factory — crée le bon parser
28class ParserFactory {
29  private static parsers = new Map<string, () => ContentParser>([
30    ['json', () => new JsonParser()],
31    ['yaml', () => new YamlParser()],
32  ]);
33
34  static create(format: string): ContentParser {
35    const factory = this.parsers.get(format.toLowerCase());
36    if (!factory) throw new Error(`Parser inconnu: ${format}`);
37    return factory();
38  }
39
40  // Extension sans modification
41  static register(format: string, factory: () => ContentParser): void {
42    this.parsers.set(format, factory);
43  }
44}
45
46// Utilisation
47const parser = ParserFactory.create('json');
48const data = parser.parse('{"key": "value"}');
49
50// Ajouter XML sans modifier ParserFactory
51ParserFactory.register('xml', () => new XmlParser());

snippet.typescript

typescript
1// Problème : créer des parsers selon le format
2// Sans Factory :
3function parseContent(content: string, format: string) {
4  if (format === 'json') return JSON.parse(content);
5  if (format === 'yaml') return parseYaml(content);
6  if (format === 'xml') return parseXml(content);
7  throw new Error(`Format inconnu: ${format}`);
8}
9// Chaque nouveau format = modifier cette fonction
10
11// Avec Factory Method :
12interface ContentParser {
13  parse(content: string): unknown;
14  stringify(data: unknown): string;
15}
16
17class JsonParser implements ContentParser {
18  parse(content: string): unknown { return JSON.parse(content); }
19  stringify(data: unknown): string { return JSON.stringify(data, null, 2); }
20}
21
22class YamlParser implements ContentParser {
23  parse(content: string): unknown { return parseYaml(content); }
24  stringify(data: unknown): string { return stringifyYaml(data); }
25}
26
27// Factory — crée le bon parser
28class ParserFactory {
29  private static parsers = new Map<string, () => ContentParser>([
30    ['json', () => new JsonParser()],
31    ['yaml', () => new YamlParser()],
32  ]);
33
34  static create(format: string): ContentParser {
35    const factory = this.parsers.get(format.toLowerCase());
36    if (!factory) throw new Error(`Parser inconnu: ${format}`);
37    return factory();
38  }
39
40  // Extension sans modification
41  static register(format: string, factory: () => ContentParser): void {
42    this.parsers.set(format, factory);
43  }
44}
45
46// Utilisation
47const parser = ParserFactory.create('json');
48const data = parser.parse('{"key": "value"}');
49
50// Ajouter XML sans modifier ParserFactory
51ParserFactory.register('xml', () => new XmlParser());

Topics and skills covered

  • Design Patterns
  • Factory
  • Creational Patterns