C# 中常用的几种设计模式及其简要描述:

创建型模式 (Creational Patterns)

  1. 单例模式 (Singleton):

    • 确保一个类只有一个实例,并提供一个全局访问点。
    • 示例:配置管理器、日志记录器等。
  2. 工厂方法模式 (Factory Method):

    • 定义一个用于创建对象的接口,让子类决定实例化哪一个类。
    • 示例:创建不同类型的日志记录器。
  3. 抽象工厂模式 (Abstract Factory):

    • 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
    • 示例:创建不同主题的用户界面组件。
  4. 建造者模式 (Builder):

    • 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    • 示例:创建复杂的文档或报表。
  5. 原型模式 (Prototype):

    • 从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
    • 示例:克隆对象。

结构型模式 (Structural Patterns)

  1. 适配器模式 (Adapter):

    • 允许不兼容的接口协同工作。
    • 示例:将一个旧的接口转换为新的接口。
  2. 装饰者模式 (Decorator):

    • 允许向一个对象动态地添加职责,而不改变对象的结构。
    • 示例:动态添加功能,如日志记录、缓存等。
  3. 代理模式 (Proxy):

    • 为其他对象提供一个代理以控制对这个对象的访问。
    • 示例:远程代理、虚拟代理、保护代理等。
  4. 桥接模式 (Bridge):

    • 将抽象部分与实现部分分离,使它们可以独立变化。
    • 示例:分离用户界面和业务逻辑。
  5. 组合模式 (Composite):

    • 允许将对象组合成树形结构以表示“部分-整体”的层次结构。
    • 示例:文件系统、菜单项等。

行为型模式 (Behavioral Patterns)

  1. 观察者模式 (Observer):

    • 定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。
    • 示例:事件处理系统。
  2. 策略模式 (Strategy):

    • 定义了一系列可互换的算法,并将它们封装在独立的类中,使算法的变化独立于使用算法的客户。
    • 示例:排序算法、支付策略等。
  3. 命令模式 (Command):

    • 将请求封装成对象,从而使你可用不同的请求对客户进行参数化。
    • 示例:撤销/重做操作、事务处理。
  4. 状态模式 (State):

    • 允许一个对象在其内部状态改变时改变它的行为。
    • 示例:有限状态机。
  5. 模板方法模式 (Template Method):

    • 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
    • 示例:框架中的基础方法。
  6. 访问者模式 (Visitor):

    • 允许你在不修改对象结构的情况下,为对象结构中的元素添加新的操作。
    • 示例:编译器优化、数据结构遍历。

其他模式

  1. 责任链模式 (Chain of Responsibility):

    • 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。
    • 示例:异常处理链。
  2. 中介者模式 (Mediator):

    • 用一个中介对象来封装一系列的对象交互。
    • 示例:窗口管理器、聊天室。
  3. 迭代器模式 (Iterator):

    • 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
    • 示例:集合类的遍历。

这些设计模式在 C# 开发中非常有用,可以帮助开发者解决常见的设计问题,提高代码的质量和可维护性。掌握这些模式并灵活应用,可以使你的代码更加健壮和灵活。

C#单例模式实现方式:
单例模式是一种简单且常用的设计模式,适用于需要全局唯一实例的场景。C#提供了多种实现单例模式的方法,各有优缺点。在实际使用时,选择适合当前需求和环境的方法显得尤为重要。选择哪种实现方式取决于具体的需求和环境。如果对性能要求较高且希望在类加载时就创建实例,可以选择饿汉式;如果希望延迟加载以节省资源,可以选择懒汉式或静态内部类;如果希望代码简洁且易于维护,可以选择 Lazy。推荐使用线程安全且高效的实现方式,如静态内部类或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; }
}

}