欢迎光临
我们一直在努力

C#实现Singleton的两种方法的比较-.NET教程,C#语言

建站超值云服务器,限时71元/月

singleton设计模式可以在应用程序创建一个唯一的全局对象,也就是说,这个对象只能被实例化一次。 应用程序中的窗口管理器或者是数据库连接池等,都是singleton模式的典型应用。

运用c#语言可以很方便地实现singleton模式,然而同样是实现singleton模式,由于实现方式的不同,运行效果也会有所不同。下面分别说明并比较c#实现singleton模式的两种方法:

c#特有的方式实现singleton(方式1)

/**//// <summary>

/// 单键模式的简单实现方式

/// </summary>

public sealed class samplesingleton1

{

private int m_counter = 0;

private samplesingleton1()

{

console.writeline("初始化samplesingleton1。");

}

public static readonly samplesingleton1 singleton = new samplesingleton1();

/**//// <summary>

/// 调用次数计数器

/// </summary>

public void counter()

{

m_counter ++;

}

}

说明一下,sealed关键字保证了该单键类不会被继承,readonly关键字保证了singleton实例入口为只读。

传统方式实现singleton(方式2)

之所以称为传统方式,是因为c++和java都是采用的这种方式,代码如下:

/**//// <summary>

/// 单键模式的传统实现方式

/// </summary>

public class samplesingleton2

{

// 注意:公用变量最好使用volatile关键字,原因参看msdn

private static volatile samplesingleton2 m_instance = null;

private int m_counter = 0;

private samplesingleton2()

{

console.writeline("初始化samplesingleton2。");

}

/**//// <summary>

/// 获取单键实例

/// </summary>

public static samplesingleton2 singleton

{

get

{

if (m_instance == null)

{

lock (typeof(samplesingleton2))

{

if (m_instance == null)

{

m_instance = new samplesingleton2();

}

}

}

return m_instance;

}

}

/**//// <summary>

/// 调用次数计数器

/// </summary>

public void counter()

{

m_counter ++;

}

}

上面的代码使用了volatile关键字和lock关键字来保证正确创建(即只创建一次)以及正确获取实例。

比较两种实现方式

可以明显看出,方式1的代码少了很多,也没有进行互斥判断以及锁定操作,因此运行速度也有一定的优势。但并不能说方法1就一定比方法2优秀,虽然方法1代码少且运行速度快,但方法1的初始化动作是在整个程序启动之时进行,而方法2的初始化动作是在第一次调用时才进行。所以在具体应用中应根据实际情况的要求来选择实现的方式。

下面是分别对两种实现方式的测试代码:

class app

{

/**//// <summary>

/// 应用程序的主入口点。

/// </summary>

[stathread]

static void main(string[] args)

{

datetime milestone;

int maxcalltimes = 100000000;

// 第一次调用samplesingleton1的counter方法

console.writeline("第一次调用samplesingleton1的counter方法");

samplesingleton1.singleton.counter();

// 计算10000次调用的耗费时间

milestone = datetime.now;

for (int i = 0; i < maxcalltimes; i ++)

{

samplesingleton1.singleton.counter();

}

console.writeline(maxcalltimes.tostring() + "次调用执行时间为:" + ((timespan)(datetime.now – milestone)).totalmilliseconds.tostring());

console.writeline("");

// 第一次调用samplesingleton2的counter方法

console.writeline("第一次调用samplesingleton2的counter方法");

samplesingleton2.singleton.counter();

// 计算10000次调用的耗费时间

milestone = datetime.now;

for (int i = 0; i < maxcalltimes; i ++)

{

samplesingleton2.singleton.counter();

}

console.writeline(maxcalltimes.tostring() + "次调用执行时间为:" + ((timespan)(datetime.now – milestone)).totalmilliseconds.tostring());

string str = console.readline();

}

}

运行结果如下:

初始化samplesingleton1。

第一次调用samplesingleton1的counter方法

100000000次调用执行时间为:1722.4768

第一次调用samplesingleton2的counter方法

初始化samplesingleton2。

100000000次调用执行时间为:3805.472

从运行结果中也可以看出,方法1的初始化动作在应用程序初始化时就进行了;而方法2的初始化动作是在第一次调用时进行。执行时间的单位为毫秒,方法1的效率比方法2的效率要高1倍左右。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » C#实现Singleton的两种方法的比较-.NET教程,C#语言
分享到: 更多 (0)

相关推荐

  • 暂无文章