C# 设计模式:完整示例指南
设计模式是软件开发中常见问题的成熟解决方案。在 .NET 生态系统和 C# 中,掌握设计模式尤为重要,因为许多模式已直接集成到平台中(例如用于 Dispose 模式的 IDisposable)。本文将根据 GoF(四人帮)分类法,通过 C# 实际示例介绍三大类设计模式。
创建型模式
创建型模式负责对象创建,使系统独立于对象的创建、组合和表示方式。
单例模式
确保一个类只有一个实例,并提供全局访问点。在 C# 中常用于日志记录器、缓存或配置管理。
public sealed class Logger{ private static readonly Lazy<Logger> _instance = new Lazy<Logger>(() => new Logger());
public static Logger Instance => _instance.Value;
private Logger() { }
public void Log(string message) { Console.WriteLine($"[{DateTime.Now}] {message}"); }}
// 使用示例Logger.Instance.Log("应用程序已启动");工厂方法模式
定义创建对象的接口,但让子类决定实例化哪个类。适用于需要扩展的逻辑。
public interface ITransport{ void Deliver();}
public class Truck : ITransport{ public void Deliver() => Console.WriteLine("公路运输");}
public class Ship : ITransport{ public void Deliver() => Console.WriteLine("海运配送");}
public abstract class Logistics{ public abstract ITransport CreateTransport();
public void PlanDelivery() { var transport = CreateTransport(); transport.Deliver(); }}
public class RoadLogistics : Logistics{ public override ITransport CreateTransport() => new Truck();}
public class SeaLogistics : Logistics{ public override ITransport CreateTransport() => new Ship();}
// 使用示例Logistics logistics = new RoadLogistics();logistics.PlanDelivery(); // 公路运输结构型模式
结构型模式定义类和对象的组合方式,以形成更大的结构。
适配器模式
将一个类的接口转换为客户端期望的另一个接口。常用于集成第三方库或遗留代码。
// 目标接口(ITarget)public interface IXmlParser{ string ParseToXml(string data);}
// 适配者类public class JsonParser{ public string ParseToJson(string data) { return $"{{\\"data\\": \\"{data}\\"}}"; }}
// 适配器public class JsonToXmlAdapter : IXmlParser{ private readonly JsonParser _jsonParser;
public JsonToXmlAdapter(JsonParser jsonParser) { _jsonParser = jsonParser; }
public string ParseToXml(string data) { var json = _jsonParser.ParseToJson(data); // 最简单的 JSON 到 XML 转换 return $"<data>{data}</data>"; }}
// 使用示例var adapter = new JsonToXmlAdapter(new JsonParser());string xml = adapter.ParseToXml("Hello");Console.WriteLine(xml); // <data>Hello</data>装饰器模式
动态地为对象添加新职责。在 C# 中通常通过继承或组合实现。
public interface INotifier{ void Send(string message);}
public class E