C#中的设计模式:完整指南与示例
设计模式(design patterns)是软件开发中经过验证的典型问题解决方案。在C#和.NET生态系统中,它们有助于创建灵活、可扩展且易于维护的架构。本文将介绍四种关键模式:Singleton、Factory Method、Observer和Strategy,并附带C#的实际示例。
为什么C#中需要设计模式?
设计模式不是现成的库或框架。它们是概念性模板,能够:
- 简化沟通 — 开发人员使用统一的术语
- 提高代码质量 — 降低耦合度,增加灵活性
- 节省时间 — 无需重复造轮子
- 符合SOLID原则 — 大多数模式都实现了这些原则
1. Singleton(单例模式)
目的: 确保一个类只有一个实例,并提供一个全局访问点。
使用场景:
- 日志记录器
- 配置管理器
- 数据库连接池
- 缓存
C#示例(线程安全实现):
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; }}
// 使用方式var config = ConfigurationManager.Instance;Console.WriteLine(config.GetSetting("ConnectionString"));优点:
- 对唯一实例的受控访问
- 延迟初始化(Lazy<T>)
- 无需锁定的线程安全
2. Factory Method(工厂方法模式)
目的: 定义创建对象的接口,但让子类决定实例化哪个类。
使用场景:
- 当预先不知道具体对象类型时
- 当对象创建需要复杂逻辑时
- 为了分离创建代码和使用代码
C#示例:
// 抽象产品public interface ILogger{ void Log(string message);}
// 具体产品public 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}");}
// 带有工厂方法的创建者public 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();}
// 使用方式LoggerFactory factory = new ConsoleLoggerFactory();factory.LogMessage("Привет, мир!");