深入设计模式(二)——单例模式(Singleton Pattern)

时间:2023-03-08 19:14:26
深入设计模式(二)——单例模式(Singleton Pattern)

一、单例模式介绍

单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。

二、解决问题

   当一个类只允许创建一个实例时,可以考虑使用单例模式。

三、单例模式分析(Analysis)

1.代码

单例模式类 Singleton:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 单例模式
{
public class Singleton
{
private static Singleton instance; /// <summary>
/// 程序运行时,创建一个静态只读的进程辅助对象
/// </summary>
private static readonly object _object = new object(); /// <summary>
/// 构造方法私有,外键不能通过New类实例化此类
/// </summary>
private Singleton() { } /// <summary>
/// 此方法是本类实例的唯一全局访问点
/// (双重加锁)
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
//先判断实例是否存在,不存在再加锁处理
if (instance == null)
{
//在同一时刻加了锁的那部分程序只有一个线程可以进入
lock (_object)
{
//如实例不存在,则New一个新实例,否则返回已有实例
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}

客服端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 单例模式
{
class Program
{
static void Main(string[] args)
{
/*
一、单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。 二、解决的问题(What To Solve) 当一个类只允许创建一个实例时,可以考虑使用单例模式。
*
*/ Singleton singleton1 = Singleton.GetInstance(); Singleton singleton2 = Singleton.GetInstance(); if (singleton1 == singleton2)
{ Console.WriteLine("实例singleton1与实例singleton2相同!"); } Console.ReadKey();
}
}
}

2.运行结果

深入设计模式(二)——单例模式(Singleton Pattern)

3.注意

3.1 单例模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与单例模式初衷违背。

3.2 单例模式中的实例构造器可以设置为protected以允许类派生。

3.3 单例模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与单例模式的初衷违背。

3.4 单例模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收一对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。