《创建型-C#单例模式》
单例模式(ObserverPattern)
意图:在GOF一书中阐述的非常明确——“让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点”,简单理解就是你定义的Class (类) 只会被new 一次。
- 场景:
1.1生成全局订单号,订单号必须保持唯一,如果多次new 订单类容易出现重复id 。
1.2创建全局日志访问帮助类。
1.3创建全局配置访问帮助类 。 - 需求:
我有一个配置文件,现在读取方法也已经写好了,需要你封装一个单例确保全局调用他的时候只会被实例化一次。
C# 实现代码
ConfigSingleton.cs
//sealed :被修饰的类或方法不能被重写或继承
//internal 只有在同一程序集的文件中,内部类型或成员才可访问
public sealed class ConfigSingleton
{
private ConfigSingleton() { }
private static ConfigSingleton _instance;
public static ConfigSingleton GetInstance() {
if (_instance == null)
{
_instance = new ConfigSingleton();*
}
return _instance;
}
//方法
public void WriteLog()
{
Console.WriteLine("执行方法:WriteLog()");
}
}
Program.cs
static void Main(string[] args)
{
// 传统调用方式 一 new 一个对象然后调用
// var config = new ConfigSingleton();报错
var config = ConfigSingleton.GetInstance();
config.WriteLog();
Console.WriteLine("Hello World!");
}
当然这是最简单的一类,由此可以简单理解为 单例能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
** 后来有前辈实际使用中,发现上述单例还有优化空间,他们提出更多优化方案,针对不同需求的场景,以下单例实现的方式**
- 饿汉式
private static readonly ConfigSingleton _instance = new ConfigSingleton();
public static ConfigSingleton GetInstance {
get {
return _instance;
}
}
- 懒汉式
private static readonly Lazy<ConfigSingleton> lazy = new Lazy<ConfigSingleton>(() => new ConfigSingleton());
/// <summary>
/// () =>new ConfigSingleton()这句话只是C#的一种语法糖,匿名委托会提及
/// </summary>
/// <returns></returns>
public static ConfigSingleton GetInstance
{
get { return lazy.Value; }
}

浙公网安备 33010602011771号