C# 实现的 23 种设计模式简明示例
·
以下是用 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]。
更多推荐

所有评论(0)