Modèles de conception en C# : guide complet avec exemples
Les modèles de conception (design patterns) sont des solutions éprouvées aux problèmes typiques du développement logiciel. Dans l'écosystème C# et .NET, ils aident à créer une architecture flexible, évolutive et maintenable. Dans cet article, nous analyserons quatre modèles clés : Singleton, Factory Method, Observer et Strategy, avec des exemples concrets en C#.
Pourquoi les modèles de conception sont-ils nécessaires en C# ?
Les modèles ne sont pas des bibliothèques ou des frameworks prêts à l'emploi. Ce sont des modèles conceptuels qui :
- Simplifient la communication — les développeurs utilisent une terminologie unifiée
- Améliorent la qualité du code — réduisent le couplage et augmentent la flexibilité
- Font gagner du temps — il n'est pas nécessaire de réinventer la roue
- Respectent les principes SOLID — la plupart des modèles implémentent ces principes
1. Singleton (Singleton)
Objectif : Garantir qu'une classe n'a qu'une seule instance et fournir un point d'accès global à celle-ci.
Quand l'utiliser :
- Journaux (loggers)
- Gestionnaires de configuration
- Pools de connexions à la base de données
- Caches
Exemple en C# (implémentation thread-safe) :
public sealed class ConfigurationManager{ private static readonly Lazy<ConfigurationManager> _instance = new Lazy<ConfigurationManager>(() => new ConfigurationManager());
private readonly Dictionary<string, string> _settings;
private ConfigurationManager() { _settings = new Dictionary<string, string> { { "ConnectionString", "Server=localhost;Database=myDb" }, { "ApiKey", "12345-ABCDE" } }; }
public static ConfigurationManager Instance => _instance.Value;
public string GetSetting(string key) { return _settings.TryGetValue(key, out var value) ? value : null; }}
// Utilisationvar config = ConfigurationManager.Instance;Console.WriteLine(config.GetSetting("ConnectionString"));Avantages :
- Accès contrôlé à l'instance unique
- Initialisation paresseuse (Lazy<T>)
- Sécurité des threads sans verrous
2. Factory Method (Méthode de fabrique)
Objectif : Définir une interface pour créer un objet, mais permettre aux sous-classes de modifier le type d'objet créé.
Quand l'utiliser :
- Lorsque le type concret de l'objet n'est pas connu à l'avance
- Lorsque la création d'un objet nécessite une logique complexe
- Pour séparer le code de création et d'utilisation
Exemple en C# :
// Produit abstraitpublic interface ILogger{ void Log(string message);}
// Produits concretspublic class FileLogger : ILogger{ public void Log(string message) => File.AppendAllText("log.txt", $"{DateTime.Now}: {message}");}
public class ConsoleLogger : ILogger{ public void Log(string message) => Console.WriteLine($"{DateTime.Now}: {message}");}
// Créateur avec méthode de fabriquepublic abstract class LoggerFactory{ public abstract ILogger CreateLogger(); public void LogMessage(string message) { var logger = CreateLogger(); logger.Log(message); }}
public class FileLoggerFactory : LoggerFactory{ public override ILogger CreateLogger() => new FileLogger();}
public class ConsoleLoggerFactory : LoggerFactory{ public override ILogger CreateLogger() => new ConsoleLogger();}
// UtilisationLoggerFactory factory = new ConsoleLoggerFactory();factory.LogMessage("Bonjour le monde !");