C#的单例模式实现

只能生成一个实例的类是实现了Singleton(单例)模式的类。以下为C#实现单例模式的方式。

方式一只使用于单线程环境
// 把构造函数设为私有函数以禁止他人创建实例
// 定义一个静态的实例在需要的时候创建该实例
// 在Singlrton的静态属性Instance中只有在instance为null的时候才创建一个实例以避免
// 重复创建
// 把构造函数定义为私有函数
public sealed class Singleton1
{
public int a = 2;
private Singleton1() { } private static Singleton1 instance = null; public static Singleton1 Instance { get { if (instance == null) instance = new Singleton1(); return instance; } } } 方式二虽然在多线程环境中能工作但效率不高
// 每次通过属性Instance得到Singleton2的实例都会试图加上一个同步锁
// 而加锁是一个非常耗时的操作在没有必要的时候应该尽量避免
public sealed class Singleton2
{
public int a = 2;
private Singleton2(){}
private static readonly object syncObj = new object();
private static Singleton2 instance = null;
public static Singleton2 Instance
{
get
{
lock (syncObj)
{
if (instance == null)
instance = new Singleton2();
}
return instance;
}
}
}
可行的解法 加同步锁前后两次判断实例是否已存在
// 只有instance为null即没有创建时需要加锁操作。
public sealed class Singleton3
{
private Singleton3() { }
private static readonly Object syncObj = new Object();
private static Singleton3 instance = null;
public static Singleton3 Instance
{
get
{
if(instance == null)
{
lock(syncObj)
{
if(instance == null)
instance = new Singleton3();
}
}
return instance;
}
}
}
推荐的解法一利用静态构造函数
// 在初始化静态变量instance的时候创建一个实例
// 由于C#是在调用静态构造函数时初始化静态变量.NET运行时能够确保只调用一次静态构造
// 函数保证只初始化一次instance
public sealed class Singleton4
{
private Singleton4() { }
private static Singleton4 instance = new Singleton4();
public static Singleton4 Instance
{
get
{
return instance;
}
}
}
推荐的解法二 实现按需创建实例
// 在内部定义了一个私有类型Nested。
// 当第一次用到这个嵌套类的时候会调用静态构造函数创建Singleton5的实例instance
public sealed class Singleton5
{
private Singleton5() { }
public static Singleton5 Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
static Nested() { }
internal static readonly Singleton5 instance = new Singleton5();
}
}
扩展 定义一个表示总统的类型President可以从该类型继承出FrenchPresident 和AmericanPresident等类型。这些派生类型都只能产生一个实例
public class President
{
private string name = “”;
private string country = “”;
public President() { }
public string Name
{
get { return name; }
set { name = value; }
}
public string Country
{
get { return country; }
set { country = value; }
}
}

public sealed class FrenchPresident: President
{
private FrenchPresident():base() { }
private static FrenchPresident instance = new FrenchPresident();
public static FrenchPresident Instance
{
get { return (FrenchPresident)(Nested.instance); }
}
private class Nested
{
static Nested() { }
internal static readonly FrenchPresident instance = new FrenchPresident();
}
}

public sealed class AmericanPresident : President
{
private AmericanPresident() : base() { }
private static AmericanPresident instance = new AmericanPresident();
public static AmericanPresident Instance
{
get { return Nested.instance; }
}
private class Nested
{
static Nested() { }
internal static readonly AmericanPresident instance = new AmericanPresident();
}
}
实现泛型单例模式
public class SingletonExample where T : class, new()
{
public static T Instance
{
get { return Nested.instance; }
}
private class Nested
{
static Nested() { }
internal static readonly T instance = new T();
}
}
public class Two: SingletonExample
{
public int a = 2;
public void Show()
{
Console.WriteLine(a);
}
}
东莞网站建设www.zg886.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值