C#设计中单例模式实例讲解
前言
最近开始花点心思研究下设计模式,主要还是让自己写的代码可重用性高、保证代码可靠性。所谓设计模式,我找了下定义:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
为什么要提倡“Design Pattern(设计模式)”?
根本原因是为了代码复用,增加可维护性。因此这次我们来学习下设计模式,最后会通过C#语言来实现这些设计模式作为例子,深刻理解其中的精髓。
定义
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
特点
1、 某个类只能有一个实例
2、它必须自行创建这个实例
3、它必须自行向整个系统提供这个实例。
优缺点
优点:
一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点:
一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的`语言中(例如基于 Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
复制代码 代码如下:
///
/// 单例模式
///
public class Singleton
{
// 定义一个静态变量来保存类的实例
private static Singleton mySingleton;
// 定义私有构造函数,使外界不能创建该类实例
private Singleton()
{
}
//定义公有方法提供一个全局访问点。
public static Singleton GetInstance()
{
//这里的lock其实使用的原理可以用一个词语来概括“互斥”这个概念也是操作系统的精髓
//其实就是当一个进程进来访问的时候,其他进程便先挂起状态
if (mySingleton == null)
{
mySingleton = new Singleton();
}
return mySingleton;
}
}
上面的单例模式的实现是有问题的,当多个用户或者方法同时访问的时候,便会出现多个用户同时拿到了mySingleton==null的结果,这个明显不是我们想要的,因此,我们应该通过一个锁来互斥这个方法,当很多线程同时访问的时候,只允许一个线程进入到代码中执行,而其他的便只能处于挂起的状态。
复制代码 代码如下:
///
/// 单例模式
///
public class Singleton
{
// 定义一个静态变量来保存类的实例
private static Singleton mySingleton;
// 定义一个标识确保线程同步
private static readonly object locker = new object();
// 定义私有构造函数,使外界不能创建该类实例
private Singleton()
{
}
//定义公有方法提供一个全局访问点。
public static Singleton GetInstance()
{
//这里的lock其实使用的原理可以用一个词语来概括“互斥”这个概念也是操作系统的精髓
//其实就是当一个进程进来访问的时候,其他进程便先挂起状态
if (mySingleton == null)//区别就在这里
{
lock (locker)
{
// 如果类的实例不存在则创建,否则直接返回
if (mySingleton == null)
{
mySingleton = new Singleton();
}
}
}
return mySingleton;
}
}
其实在一些项目中,单例模式早就有了体现。在开发的项目中,就已经用这种方法来包装http上下文来实现计算机资源的节省。
复制代码 代码如下:
///
/// 业务仓储
///
public Session BLLSession;
//---------------------定义上下文属性
#region 实例构造函数 初始化业务仓储 + OperateContext()
public OperateContext()
{
BLLSession = bject
}
#endregion
#region Http上下文 以及相关属性
///
/// Http上下文
///
HttpContext ContextHttp
{
get
{
return ent;
}
}
HttpResponse Response
{
get
{
return onse;
}
}
HttpRequest Request
{
get
{
return est;
}
}
HttpSessionState Session
{
get
{
return ion;
}
}
#endregion
#region 获取当前操作上下文(存在线程中,提高效率) + OperateContext Current
//
/// 获取当前操作上下文(存在线程中,提高效率)
///
public static OperateContext Current
{
get
{
OperateContext o = ata(typeof(OperateContext)) as OperateContext;
if (o == null)
{
o = new OperateContext();
ata(typeof(OperateContext), o);
}
return o;
}
}
#endregion
总结
到这里,就和大家一起先了解了单例模式到底是个什么东西,其实在一些项目中,这种模式就已经应用了,只是我们没有去发现和总结,不过本来设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。哎。。。。这次是第二次编辑了,本来这个单例模式已经发布了好多天,竟然被我新的一篇观察者模式给覆盖了,数据取不回来,只能匆匆完稿,大家见谅啊,有问题我们一起来讨论,毕竟我也是初学者。
-
设计作文6篇[经典]
在学习、工作乃至生活中,大家一定都接触过作文吧,作文可分为国小作文、中学作文、大学作文(论文)。你知道作文怎样写才规范吗?以下是小编精心整理的设计作文6篇,仅供参考,大家一起来看看吧。设计作文篇1一、谈话导入,引出模式。1、小朋友们,这是什么?(师在黑板画一个圆)2、...
-
设计房子的作文集合(5篇)
在日常学习、工作或生活中,大家都跟作文打过交道吧,作文是从内部言语向外部言语的过渡,即从经过压缩的简要的、自己能明白的语言,向开展的、具有规范语法结构的、能为他人所理解的外部语言形式的转化。你知道作文怎样才能写的好吗?下面是小编帮大家整理的设计房子的...
-
一年级下语文教案指导设计范文
作为一名为他人授业解惑的教育工作者,常常需要准备教案,教案是保证教学取得成功、提高教学质量的基本条件。快来参考教案是怎么写的吧!下面是小编精心整理的一年级下语文教案指导设计范文,欢迎阅读,希望大家能够喜欢。一年级下语文教案指导设计范文1《火烧云》【教...
-
我是设计师作文优秀(3篇)
在平凡的学习、工作、生活中,说到作文,大家肯定都不陌生吧,作文是人们以书面形式表情达意的言语活动。你知道作文怎样写才规范吗?以下是小编为大家整理的我是设计师作文3篇,希望能够帮助到大家。我是设计师作文篇1设计师千千万,设计师的领域涉足到方方面面,有高科技的...