Chapitre 1 · Leçon 1
Déléguer la création d'objets
Section 1
Step 1
Factory Method : définir une interface pour créer un objet, mais laisser les sous-classes décider quelle classe instancier.
snippet.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());