C#中常用的几种设计模式及其简要描述
C# 中常用的几种设计模式及其简要描述:
创建型模式 (Creational Patterns)
单例模式 (Singleton):
- 确保一个类只有一个实例,并提供一个全局访问点。
- 示例:配置管理器、日志记录器等。
工厂方法模式 (Factory Method):
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类。
- 示例:创建不同类型的日志记录器。
抽象工厂模式 (Abstract Factory):
- 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 示例:创建不同主题的用户界面组件。
建造者模式 (Builder):
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 示例:创建复杂的文档或报表。
原型模式 (Prototype):
- 从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
- 示例:克隆对象。
结构型模式 (Structural Patterns)
适配器模式 (Adapter):
- 允许不兼容的接口协同工作。
- 示例:将一个旧的接口转换为新的接口。
装饰者模式 (Decorator):
- 允许向一个对象动态地添加职责,而不改变对象的结构。
- 示例:动态添加功能,如日志记录、缓存等。
代理模式 (Proxy):
- 为其他对象提供一个代理以控制对这个对象的访问。
- 示例:远程代理、虚拟代理、保护代理等。
桥接模式 (Bridge):
- 将抽象部分与实现部分分离,使它们可以独立变化。
- 示例:分离用户界面和业务逻辑。
组合模式 (Composite):
- 允许将对象组合成树形结构以表示“部分-整体”的层次结构。
- 示例:文件系统、菜单项等。
行为型模式 (Behavioral Patterns)
观察者模式 (Observer):
- 定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。
- 示例:事件处理系统。
策略模式 (Strategy):
- 定义了一系列可互换的算法,并将它们封装在独立的类中,使算法的变化独立于使用算法的客户。
- 示例:排序算法、支付策略等。
命令模式 (Command):
- 将请求封装成对象,从而使你可用不同的请求对客户进行参数化。
- 示例:撤销/重做操作、事务处理。
状态模式 (State):
- 允许一个对象在其内部状态改变时改变它的行为。
- 示例:有限状态机。
模板方法模式 (Template Method):
- 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
- 示例:框架中的基础方法。
访问者模式 (Visitor):
- 允许你在不修改对象结构的情况下,为对象结构中的元素添加新的操作。
- 示例:编译器优化、数据结构遍历。
其他模式
责任链模式 (Chain of Responsibility):
- 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。
- 示例:异常处理链。
中介者模式 (Mediator):
- 用一个中介对象来封装一系列的对象交互。
- 示例:窗口管理器、聊天室。
迭代器模式 (Iterator):
- 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
- 示例:集合类的遍历。
这些设计模式在 C# 开发中非常有用,可以帮助开发者解决常见的设计问题,提高代码的质量和可维护性。掌握这些模式并灵活应用,可以使你的代码更加健壮和灵活。
C#单例模式实现方式:
单例模式是一种简单且常用的设计模式,适用于需要全局唯一实例的场景。C#提供了多种实现单例模式的方法,各有优缺点。在实际使用时,选择适合当前需求和环境的方法显得尤为重要。选择哪种实现方式取决于具体的需求和环境。如果对性能要求较高且希望在类加载时就创建实例,可以选择饿汉式;如果希望延迟加载以节省资源,可以选择懒汉式或静态内部类;如果希望代码简洁且易于维护,可以选择 Lazy
1、饿汉式
饿汉式单例模式在类加载时就创建实例。这种方法的优点是简单易实现,不需要处理线程安全问题;缺点是不管是否需要实例都会占用内存。
public class Singleton
{
// 在类加载时创建实例
private static readonly Singleton instance = new Singleton();
// 私有构造函数,防止外部实例化
private Singleton() { }
public static Singleton Instance
{
get { return instance; }
}
}
2、懒汉式(双重检测锁定)
懒汉式单例模式在第一次使用时才创建实例。这种方法的优点是延迟了实例的创建,节省了资源;缺点是需要考虑线程安全问题。
public class Singleton
{
private static volatile Singleton instance;
private static readonly object lockObj = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (lockObj)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
3、静态内部类
静态内部类方式利用了类加载机制来实现单例模式,既保证了线程安全,又实现了延迟加载。
public class Singleton
{
// 私有构造函数,防止外部实例化
private Singleton() { }
// 静态内部类,持有单例实例
private static class SingletonHolder
{
private static readonly Singleton INSTANCE = new Singleton();
}
public static Singleton Instance
{
get { return SingletonHolder.INSTANCE; }
}
}
4、静态构造函数
C#的静态构造函数只会在类型首次被使用前执行一次,因此可以用来实现单例模式。这种方法也是线程安全的。
public class Singleton
{
private static Singleton _instance;
// 静态构造函数,在类型首次被使用前执行一次
static Singleton()
{
_instance = new Singleton();
}
private Singleton() { }
public static Singleton Instance
{
get { return _instance; }
}
}
5、Lazy
C# 提供了 System.Lazy
public class Singleton
{
private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
// 私有构造函数,防止外部实例化
private Singleton() { }
public static Singleton Instance
{
get { return lazy.Value; }
}
}