一、概述定义
定义:
确保一个类只有一个实例,并提供全局访问点以获取该实例。它是一种创建型模式,通常用于需要严格控制某个类的实例数量的情况。
目的:
单例模式确保一个类在整个应用程序生命周期中只有一个实例,可以节省系统资源。
关键点:

二、应用场景
三、优缺点
优点
缺点
四、实现示例
饿汉式:
public class Singleton1{
///
/// 私有静态实例,初始化时创建
///
private static Singleton1 instance = new Singleton1( );
///
/// 私有构造函数,外部无法实例化
///
private Singleton1 ( ) { }
///
/// 公有静态方法,返回静态实例
///
///
public static Singleton1 GetInstance ( )
{
return instance;
}
///
/// 业务方法
///
public void DoSomething ( )
{
Console.WriteLine( "Do something" );
}
}
初始化时机:饿汉模式是在应用程序启动时就进行单例对象的初始化,无论是否会被使用。因此,单例对象在应用程序生命周期内都存在。
优点:
缺点:
懒汉式:(线程不安全)
public class Singleton2///
{
/// 私有静态实例,初始化时创建
///
private static Singleton2 instance;
///
/// 私有构造函数,外部无法实例化
///
private Singleton2 ( ) { }
///
/// 公有静态方法,返回静态实例
///
///
public static Singleton2 GetInstance ( ) {
if ( instance == null )
{
instance = new Singleton2( );
}
return instance;
}
///
/// 业务方法
///
public void DoSomething ( )
{
Console.WriteLine( "Do something" );
}
}
初始化时机:懒汉模式是延迟加载的,在首次访问时才进行初始化。在多线程环境中,可能会出现竞态条件,需要额外的线程安全措施来确保只创建一个实例。
优点:
缺点:
懒汉式:(线程安全)
public class Singleton3
{
private static Singleton3 instance;
///
/// 锁对象
///
private static readonly object syncRoot = new object( );
private Singleton3 ( ) { }
public static Singleton3 GetInstance ( )
{
if ( instance == null )
{
// 双重锁定
lock ( syncRoot )
{
if ( instance == null )
{
instance = new Singleton3( );
}
}
}
return instance;
}
public void DoSomething ( )
{
Console.WriteLine( "Do something" );
}
}
特点:
第一次调用时才创建实例,方法同步,线程安全但效率低。
优点:
缺点:
懒汉式:(静态内部类)
public class Singleton5
{
///
/// 私有构造函数,防止外部实例化
///
private Singleton5 ( ) { }
///
/// 公有静态方法,提供全局访问点
///
/// 单例实例
public static Singleton5 GetInstance ( )
{
// 通过静态内部类获取单例实例
return Nested.instance;
}
///
/// 静态内部类,负责实例的延迟初始化
///
private class Nested
{
// 静态构造函数,确保类型初始化时只执行一次
static Nested ( ) { }
// 静态只读实例,保证唯一性和线程安全
internal static readonly Singleton5 instance = new Singleton5( );
}
///
/// 业务方法
///
public void DoSomething ( )
{
Console.WriteLine( "Do something" );
}
}
优点:
缺点:
懒汉式:(Lazy<T>)
public class Singleton6
{
///
/// 使用Lazy类型实现延迟初始化和线程安全
///
private static readonly Lazy lazy = new Lazy( ( ) => new Singleton6( ) );
///
/// 私有构造函数,防止外部实例化
///
private Singleton6 ( ){}
///
/// 公有静态方法,提供全局访问点
///
/// 单例实例
public static Singleton6 GetInstance ( )
{
return lazy.Value;
}
///
/// 业务方法
///
public void DoSomething ( )
{
Console.WriteLine( "Do something" );
}
}
优点
缺点
五、总结思考