一、简介
上一篇博客,主要介绍了单例模式的相关理论,但是却没有过多的应用,本博客将主要介绍单例模式的应用:
C# 基础(十四)C#单例模式:首先介绍 单线程、多线程、加锁 单例模式。然后介绍单例模式的线程同步:多线程有序访问共享内存。
二、单例模式的应用
1、好了,以上问题虽然讨论的单例模式的相关理论,但是却么有怎么应用。现在,我把单例模式应用起来。建立C#控制台程序,我用到了三个类:
2、不多说了,现在直接把程序附上,自己慢慢调试,可以注释掉方法2/3,剩下方法1,看看效果。
也可以全部保留全部的方法,然后单部执行,你会发现只有方法1进行了实例化,方法2/3就不会进行实例化了。
Program.cs
#region 单实例类
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Messaging;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace test
{
class Program
{
static void Main(string[] args)
{
//方法1:中间类ClassB调用了单实例类Singleton,通过实例化中间类ClassB。
ClassB classb = new ClassB();
classb.methodB();
//方法2:直接实例化Singleton。
Singleton singleton = Singleton.GetInstance();
Console.WriteLine(singleton.iGlobalNum1);
//方法3:调用方法GetSingleton()来实例化Singleton。
GetSingleton();
Console.ReadLine();
}
static private void GetSingleton()
{
Singleton singleton = Singleton.GetInstance();
Console.WriteLine(singleton.bGlobalStatus1);
}
}
}
#endregion
ClassB.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using test;
namespace test
{
class ClassB
{
Singleton singleton = Singleton.GetInstance();
public void methodB()
{
Console.WriteLine(singleton.iGlobalNum1);
//iGlobalNum2字段,是私有的,故不能被访问。
//Console.WriteLine(singleton.iGlobalNum2);
Console.WriteLine(singleton.bGlobalStatus1);
}
}
}
Singleton.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace test
{
public class Singleton
{
public int iGlobalNum1;
private int iGlobalNum2;
public bool bGlobalStatus1;
// 定义一个静态变量来保存类的实例
private volatile static Singleton uniqueInstance;
// 定义私有构造函数,使外界不能创建该类实例
private Singleton()
{
iGlobalNum1 = 11;
iGlobalNum2 = 22;
bGlobalStatus1 = false;
}
/// <summary>
/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
// 如果类的实例不存在则创建,否则直接返回
if (uniqueInstance == null)
{
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
}