以下是用 ‌C#‌ 实现的 23 种设计模式简明示例(每个模式核心代码片段):

‌一、创建型模式(5种)‌
‌1. 单例模式 (Singleton)‌
csharp
Copy Code
public class Logger
{
    private static Logger _instance;
    private static readonly object _lock = new object();

    private Logger() {} // 私有构造

    public static Logger Instance
    {
        get
        {
            lock (_lock)
            {
                return _instance ??= new Logger();
            }
        }
    }

    public void Log(string message) => Console.WriteLine(message);
}
// 使用:Logger.Instance.Log("Test");
‌2. 工厂方法 (Factory Method)‌
csharp
Copy Code
public interface IDatabase
{
    void Connect();
}

public class SqlServer : IDatabase
{
    public void Connect() => Console.WriteLine("SQL Server connected");
}

public class Oracle : IDatabase
{
    public void Connect() => Console.WriteLine("Oracle connected");
}

public abstract class DatabaseFactory
{
    public abstract IDatabase CreateDatabase();
}

public class SqlServerFactory : DatabaseFactory
{
    public override IDatabase CreateDatabase() => new SqlServer();
}
// 使用:new SqlServerFactory().CreateDatabase().Connect();
‌3. 抽象工厂 (Abstract Factory)‌
csharp
Copy Code
public interface IButton { void Render(); }
public interface ITextBox { void Display(); }

public class WindowsButton : IButton
{
    public void Render() => Console.WriteLine("Windows风格按钮");
}

public class MacTextBox : ITextBox
{
    public void Display() => Console.WriteLine("Mac风格文本框");
}

public interface IUIFactory
{
    IButton CreateButton();
    ITextBox CreateTextBox();
}

public class MacUIFactory : IUIFactory
{
    public IButton CreateButton() => new MacButton();
    public ITextBox CreateTextBox() => new MacTextBox();
}
// 使用:factory.CreateButton().Render();
‌4. 建造者 (Builder)‌
csharp
Copy Code
public class Computer
{
    public string CPU { get; set; }
    public string RAM { get; set; }
}

public interface IComputerBuilder
{
    void BuildCPU();
    void BuildRAM();
    Computer GetResult();
}

public class GamingComputerBuilder : IComputerBuilder
{
    private Computer _computer = new Computer();

    public void BuildCPU() => _computer.CPU = "Intel i9";
    public void BuildRAM() => _computer.RAM = "32GB DDR5";
    public Computer GetResult() => _computer;
}

public class Director
{
    public Computer Construct(IComputerBuilder builder)
    {
        builder.BuildCPU();
        builder.BuildRAM();
        return builder.GetResult();
    }
}
// 使用:director.Construct(new GamingComputerBuilder());
‌5. 原型模式 (Prototype)‌
csharp
Copy Code
public interface ICloneable<T>
{
    T Clone();
}

public class UserProfile : ICloneable<UserProfile>
{
    public string Name { get; set; }
    public int Age { get; set; }

    public UserProfile Clone() => (UserProfile)MemberwiseClone();
}
// 使用:var clone = original.Clone();
‌二、结构型模式(7种)‌
‌6. 适配器 (Adapter)‌
csharp
Copy Code
public interface IJsonParser
{
    string Parse(string data);
}

public class XmlToJsonAdapter : IJsonParser
{
    private readonly XmlParser _xmlParser = new XmlParser();

    public string Parse(string data)
    {
        string xmlData = _xmlParser.ParseXml(data);
        return ConvertXmlToJson(xmlData);
    }

    private string ConvertXmlToJson(string xml) => "{ ... }";
}
// 使用:IJsonParser parser = new XmlToJsonAdapter();
‌7. 装饰器 (Decorator)‌
csharp
Copy Code
public interface IStream
{
    void Write(string data);
}

public class FileStream : IStream
{
    public void Write(string data) => Console.WriteLine($"写入文件: {data}");
}

public class BufferedStream : IStream
{
    private readonly IStream _stream;

    public BufferedStream(IStream stream) => _stream = stream;

    public void Write(string data)
    {
        Console.WriteLine("添加缓冲");
        _stream.Write(data);
    }
}
// 使用:new BufferedStream(new FileStream()).Write("data");
‌8. 代理 (Proxy)‌
csharp
Copy Code
public interface IImage
{
    void Display();
}

public class RealImage : IImage
{
    public RealImage(string fileName) => Load(fileName);

    private void Load(string fileName) => Console.WriteLine($"加载图片: {fileName}");

    public void Display() => Console.WriteLine("显示图片");
}

public class ImageProxy : IImage
{
    private RealImage _realImage;
    private readonly string _fileName;

    public ImageProxy(string fileName) => _fileName = fileName;

    public void Display()
    {
        _realImage ??= new RealImage(_fileName);
        _realImage.Display();
    }
}
// 使用:new ImageProxy("test.jpg").Display();
‌9. 外观 (Facade)‌
csharp
Copy Code
public class CPU
{
    public void Start() => Console.WriteLine("CPU启动");
}

public class Memory
{
    public void Load() => Console.WriteLine("内存加载");
}

public class ComputerFacade
{
    private readonly CPU _cpu = new CPU();
    private readonly Memory _memory = new Memory();

    public void Start()
    {
        _cpu.Start();
        _memory.Load();
        Console.WriteLine("计算机启动完成");
    }
}
// 使用:new ComputerFacade().Start();
‌10. 桥接 (Bridge)‌
csharp
Copy Code
public interface IRenderer
{
    void RenderCircle(float radius);
}

public class VectorRenderer : IRenderer
{
    public void RenderCircle(float radius) => Console.WriteLine($"矢量圆半径: {radius}");
}

public abstract class Shape
{
    protected IRenderer renderer;
    protected Shape(IRenderer renderer) => this.renderer = renderer;
    public abstract void Draw();
}

public class Circle : Shape
{
    private float _radius;
    public Circle(float radius, IRenderer renderer) : base(renderer) => _radius = radius;
    public override void Draw() => renderer.RenderCircle(_radius);
}
// 使用:new Circle(5, new VectorRenderer()).Draw();
‌11. 组合 (Composite)‌
csharp
Copy Code
public interface IGraphic
{
    void Draw();
}

public class Circle : IGraphic
{
    public void Draw() => Console.WriteLine("绘制圆形");
}

public class GraphicGroup : IGraphic
{
    private readonly List<IGraphic> _children = new List<IGraphic>();

    public void Add(IGraphic graphic) => _children.Add(graphic);
    public void Draw()
    {
        foreach (var child in _children)
            child.Draw();
    }
}
// 使用:group.Add(new Circle()); group.Draw();
‌12. 享元 (Flyweight)‌
csharp
Copy Code
public class TreeType
{
    public string Name { get; }
    public string Color { get; }

    public TreeType(string name, string color) => (Name, Color) = (name, color);
}

public class TreeFactory
{
    private static Dictionary<string, TreeType> _types = new Dictionary<string, TreeType>();

    public static TreeType GetTreeType(string name, string color)
    {
        string key = $"{name}_{color}";
        if (!_types.ContainsKey(key))
            _types[key] = new TreeType(name, color);
        return _types[key];
    }
}
// 使用:TreeFactory.GetTreeType("松树", "绿色");
‌三、行为型模式(11种)‌
‌13. 策略 (Strategy)‌
csharp
Copy Code
public interface ISortStrategy
{
    void Sort(List<int> data);
}

public class QuickSort : ISortStrategy
{
    public void Sort(List<int> data) => Console.WriteLine("快速排序");
}

public class Sorter
{
    private ISortStrategy _strategy;
    public void SetStrategy(ISortStrategy strategy) => _strategy = strategy;
    public void ExecuteSort(List<int> data) => _strategy?.Sort(data);
}
// 使用:sorter.SetStrategy(new QuickSort()); sorter.ExecuteSort(data);
‌14. 观察者 (Observer)‌
csharp
Copy Code
public class NewsPublisher
{
    private List<IObserver> _observers = new List<IObserver>();

    public void AddObserver(IObserver observer) => _observers.Add(observer);
    public void Notify(string news) => _observers.ForEach(o => o.Update(news));
}

public interface IObserver
{
    void Update(string news);
}

public class Subscriber : IObserver
{
    public void Update(string news) => Console.WriteLine($"收到新闻: {news}");
}
// 使用:publisher.AddObserver(new Subscriber()); publisher.Notify("突发新闻");
‌15. 责任链 (Chain of Responsibility)‌
csharp
Copy Code
public abstract class Handler
{
    protected Handler successor;
    public void SetSuccessor(Handler successor) => this.successor = successor;
    public abstract void HandleRequest(int request);
}

public class ConcreteHandlerA : Handler
{
    public override void HandleRequest(int request)
    {
        if (request < 10)
            Console.WriteLine("HandlerA处理");
        else
            successor?.HandleRequest(request);
    }
}
// 使用:handlerA.SetSuccessor(handlerB); handlerA.HandleRequest(5);
‌16. 模板方法 (Template Method)‌
csharp
Copy Code
public abstract class Game
{
    public void Play()
    {
        Initialize();
        StartPlay();
        EndPlay();
    }

    protected abstract void Initialize();
    protected abstract void StartPlay();
    protected virtual void EndPlay() => Console.WriteLine("游戏结束");
}

public class Chess : Game
{
    protected override void Initialize() => Console.WriteLine("初始化棋盘");
    protected override void StartPlay() => Console.WriteLine("开始下棋");
}
// 使用:new Chess().Play();
‌17. 命令 (Command)‌
csharp
Copy Code
public interface ICommand
{
    void Execute();
}

public class LightOnCommand : ICommand
{
    private readonly Light _light;
    public LightOnCommand(Light light) => _light = light;
    public void Execute() => _light.TurnOn();
}

public class RemoteControl
{
    private ICommand _command;
    public void SetCommand(ICommand command) => _command = command;
    public void PressButton() => _command?.Execute();
}
// 使用:remote.SetCommand(new LightOnCommand(light)); remote.PressButton();
‌18. 状态 (State)‌
csharp
Copy Code
public interface IState
{
    void Handle(Context context);
}

public class ConcreteStateA : IState
{
    public void Handle(Context context) => context.State = new ConcreteStateB();
}

public class Context
{
    public IState State { get; set; }
    public Context(IState state) => State = state;
    public void Request() => State.Handle(this);
}
// 使用:context.Request(); // 触发状态切换
‌19. 访问者 (Visitor)‌
csharp
Copy Code
public interface IElement
{
    void Accept(IVisitor visitor);
}

public class ConcreteElement : IElement
{
    public void Accept(IVisitor visitor) => visitor.Visit(this);
}

public interface IVisitor
{
    void Visit(ConcreteElement element);
}

public class ConcreteVisitor : IVisitor
{
    public void Visit(ConcreteElement element) => Console.WriteLine("访问元素");
}
// 使用:element.Accept(new ConcreteVisitor());
‌20. 中介者 (Mediator)‌
csharp
Copy Code
public interface IMediator
{
    void Send(string message, Colleague colleague);
}

public class ConcreteMediator : IMediator
{
    public Colleague Colleague1 { get; set; }
    public Colleague Colleague2 { get; set; }

    public void Send(string message, Colleague colleague)
    {
        if (colleague == Colleague1)
            Colleague2.Receive(message);
        else
            Colleague1.Receive(message);
    }
}
// 使用:mediator.Send("消息", colleague1);
‌21. 备忘录 (Memento)‌
csharp
Copy Code
public class EditorMemento
{
    public string Content { get; }
    public EditorMemento(string content) => Content = content;
}

public class Editor
{
    public string Content { get; set; }
    public EditorMemento Save() => new EditorMemento(Content);
    public void Restore(EditorMemento memento) => Content = memento.Content;
}
// 使用:var memento = editor.Save(); editor.Restore(memento);
‌22. 迭代器 (Iterator)‌
csharp
Copy Code
public interface IIterator
{
    bool HasNext();
    object Next();
}

public class ConcreteIterator : IIterator
{
    private readonly List<object> _items;
    private int _position;

    public ConcreteIterator(List<object> items) => _items = items;
    public bool HasNext() => _position < _items.Count;
    public object Next() => _items[_position++];
}
// 使用:iterator.HasNext(); iterator.Next();
‌23. 解释器 (Interpreter)‌
csharp
Copy Code
public interface IExpression
{
    bool Interpret(string context);
}

public class TerminalExpression : IExpression
{
    private readonly string _data;
    public TerminalExpression(string data) => _data = data;
    public bool Interpret(string context) => context.Contains(_data);
}

public class OrExpression : IExpression
{
    private IExpression _expr1;
    private IExpression _expr2;
    public OrExpression(IExpression expr1, IExpression expr2) => (_expr1, _expr2) = (expr1, expr2);
    public bool Interpret(string context) => _expr1.Interpret(context) || _expr2.Interpret(context);
}
// 使用:expression.Interpret("测试文本");
‌关键总结‌
分类	模式名称	核心场景
‌创建型‌	单例、工厂、建造者	对象创建过程控制
‌结构型‌	适配器、装饰器	类与对象的结构组合
‌行为型‌	策略、观察者	对象间通信与算法抽象
每个模式均提供最简实现,实际应用中需根据场景调整细节(如线程安全、异常处理等)[1][4][7]。

更多推荐