C#设计模式:完整指南及代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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("Привет, мир!");


3. O

博客

书籍推荐