单件模式要求一个类有且仅有一个实例,同时提供一个全局的访问点。一般的解决方案是对一个单件对象进行延迟初始化,即当第一次使用这个对象的时候才对这个对象进行初始化!
using
System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace SinglePattern
... {
/**//*
//---------------静态初始化 不可取,但是可以作为对比来了解-------------------------------
/// <summary>
/// 第一次引用类的任何成员时创建实例
/// 静态构造函数和实例构造函数之间的区别,因为静态构造函数是由CLR调用执行的,所以静态构造函数只能是一个,同时不能还有参数。
/// 第一, 代码的执行顺序,代码在前的先执行;
/// 第二, 静态成员初始化语句要先于静态构造函数执行;
/// 第三,静态成员初始化语句与静态构造函数只执行一次。
/// 什么方法来初始化静态成员?
/// 第一, 简单静态成员,例如类型为值类型等,使用成员初始化语句来完成;
/// 第二, 静态成员初始化比较复杂,或者有可能出现异常,那么用静态构造函数来完成。
/// </summary>
public sealed class Singleton
{
private static readonly Singleton instance;
static Singleton()
{
instance = new Singleton();
}
/// <summary>
/// 私有的构造函数
/// </summary>
Singleton()
{
}
/// <summary>
/// 全局访问点
/// </summary>
public static Singleton Instance
{
get
{
return instance;
}
}
}
//--------------------------------------------------------------
*/
//---------------延迟初始化-------------------------------------
public sealed class Singleton
...{
Singleton()
...{
}
public static Singleton Instance
...{
get
...{
return Nested.instance;
}
}
class Nested
...{
internal static readonly Singleton instance;
static Nested()
...{
instance = new Singleton();
}
}
private int num = 0;
/**//// <summary>
/// 增加
/// </summary>
public void Add()
...{
num++;
Console.WriteLine("输出:" + num);
}
}
//--------------------------------------------------------------
class Program
...{
public static void Print()
...{
Singleton singleton = Singleton.Instance;
lock (singleton)
...{
for (int i = 0; i < 5; i++)
...{
singleton.Add();
}
}
}
static void Main(string[] args)
...{
Thread threadFst = new Thread(new ThreadStart(Print));
threadFst.Name = "Fst";
Thread threadScd = new Thread(new ThreadStart(Print));
threadScd.Name = "Scd";
threadFst.Start();
threadScd.Start();
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace SinglePattern
... {
/**//*
//---------------静态初始化 不可取,但是可以作为对比来了解-------------------------------
/// <summary>
/// 第一次引用类的任何成员时创建实例
/// 静态构造函数和实例构造函数之间的区别,因为静态构造函数是由CLR调用执行的,所以静态构造函数只能是一个,同时不能还有参数。
/// 第一, 代码的执行顺序,代码在前的先执行;
/// 第二, 静态成员初始化语句要先于静态构造函数执行;
/// 第三,静态成员初始化语句与静态构造函数只执行一次。
/// 什么方法来初始化静态成员?
/// 第一, 简单静态成员,例如类型为值类型等,使用成员初始化语句来完成;
/// 第二, 静态成员初始化比较复杂,或者有可能出现异常,那么用静态构造函数来完成。
/// </summary>
public sealed class Singleton
{
private static readonly Singleton instance;
static Singleton()
{
instance = new Singleton();
}
/// <summary>
/// 私有的构造函数
/// </summary>
Singleton()
{
}
/// <summary>
/// 全局访问点
/// </summary>
public static Singleton Instance
{
get
{
return instance;
}
}
}
//--------------------------------------------------------------
*/
//---------------延迟初始化-------------------------------------
public sealed class Singleton
...{
Singleton()
...{
}
public static Singleton Instance
...{
get
...{
return Nested.instance;
}
}
class Nested
...{
internal static readonly Singleton instance;
static Nested()
...{
instance = new Singleton();
}
}
private int num = 0;
/**//// <summary>
/// 增加
/// </summary>
public void Add()
...{
num++;
Console.WriteLine("输出:" + num);
}
}
//--------------------------------------------------------------
class Program
...{
public static void Print()
...{
Singleton singleton = Singleton.Instance;
lock (singleton)
...{
for (int i = 0; i < 5; i++)
...{
singleton.Add();
}
}
}
static void Main(string[] args)
...{
Thread threadFst = new Thread(new ThreadStart(Print));
threadFst.Name = "Fst";
Thread threadScd = new Thread(new ThreadStart(Print));
threadScd.Name = "Scd";
threadFst.Start();
threadScd.Start();
Console.ReadLine();
}
}
}