单例模式 c#

1么是单例
单例模式(Singleton)个创建模式中最对立的一个,主要特点不是根据用户调用生成一个新的实例,而是控制某个类型的实例唯一性,通过上图我们知道它包含的角色只有一个,就是Singleton,它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
作用:单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。
2、三种写法
2.1.经典模式:
public class Singleton
{ private static Singleton instance; private Singleton()
{

} public static Singleton GetInstance()
{ if(instance==null)
{
instance=new Singleton();
} return instance;
}
}

在这种经典模式下,没有考虑线程并发获取实例问题,即可能出现两个线程同时获取instance实例,且此时其为null时,就会出现两个线程分别创建了instance,违反了单例规则。因此,需对上面代码修改。

2.2 多线程下的单例模式
public class Singleton
{ private static Singleton instance; private static object _lock=new object(); private Singleton()
{

} public static Singleton GetInstance()
{ if(instance==null)
{ lock(_lock)
{ if(instance==null)
{
instance=new Singleton();
}
}
} return instance;
}
}

上述代码使用了双重锁方式较好地解决了多线程下的单例模式实现。先看内层的if语句块,使用这个语句块时,先进行加锁操作,保证只有一个线程可以访问该语句块,进而保证只创建了一个实例。再看外层的if语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),才需加锁创建,若果已存在一个实例,就直接返回该实例,节省了性能开销。
2.3 饿汉模式
public sealed class Singleton
{ private static readonly Singleton instance=new Singleton(); private Singleton()
{
} public static Singleton GetInstance()
{ return instance;
}
}

上面使用的readonly关键可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。
3、单例模式的优点
单例模式(Singleton)会控制其实例对象的数量,从而确保访问对象的唯一性。
实例控制:单例模式防止其它对象对自己的实例化,确保所有的对象都访问一个实例。
伸缩性:因为由类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
4、单例模式的缺点:
系统开销。虽然这个系统开销看起来很小,但是每次引用这个类实例的时候都要进行实例是否存在的检查。这个问题可以通过静态实例来解决。
开发混淆。当使用一个单例模式的对象的时候(特别是定义在类库中的),开发人员必须要记住不能使用new关键字来实例化对象。因为开发者看不到在类库中的源代码,所以当他们发现不能实例化一个类的时候会很惊讶。
对象生命周期。单例模式没有提出对象的销毁。在提供内存管理的开发语言(比如,基于.NetFramework的语言)中,只有单例模式对象自己才能将对象实例销毁,因为只有它拥有对实例的引用。在各种开发语言中,比如C++,其它类可以销毁对象实例,但是这么做将导致单例类内部的指针指向不明。
5、单例适用性
使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反之,如果一个类可以有几个实例共存,就不要使用单例模式。
不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中。
不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。
喜欢阅读
  • 天生妖孽泡美男

    天生妖孽泡美男

    她,一朝穿越为凰,一人之下,万人之上!绝世六夫,先订好娃娃亲!她,只要八岁,烟火未央,与你一起欣赏脑残女主与绝世六夫的攻受大争斗。

  • 残情走进你的心

    残情走进你的心

    秦悦歆被人骂的时候,是陆晨安牵着她的手帮她一字一句地反唇相讥;秦悦歆被人打的时候,是陆晨安按着轮椅出来将她护在身后;秦悦歆说疼的时候,陆晨安二话不说拿着一把牙签就往自己的手上扎说:“我陪你一起疼!”人人都说陆晨安爱秦悦歆爱到走火入魔,就连秦悦歆也觉得陆晨安爱她爱得没有底线。她只是没想到,没有底线,只是因为从来不在他的心上停过,所以才会纵容一切。秦悦歆以为自己爱上的是一头披着狼皮的羊,却没想到陆晨安是一头披着狼皮的豹。男欢女爱是套路,可是为什么,陆晨安你不把路修到最后。

  • 佳妻难为

    佳妻难为

    结婚两年,他们却一直貌合神离……

  • 都市逆战尊王

    都市逆战尊王

    一剑斩天,睥睨天下,唯我纵横人世间。n一朝归来,杀尽天下王侯将相,冲破仙凡鬼魔,我乃无敌战神!

  • 阴婚绵绵:夫君夜夜来

    阴婚绵绵:夫君夜夜来

    午夜时分我被逼迫去墓室背尸体,被一只冰冷刺骨的手攥住了,说要娶我……

  • 墨爷宠妻三十六计

    墨爷宠妻三十六计

    安有如逃婚了!作为安家养女且刚大学毕业有男朋友的安有雪,在养母的逼迫下,迫于无奈嫁给所谓的“老头姐夫”,却不想婚后,彻底被宠上了天!新婚之夜。“外界传闻,墨家二叔墨经历年过五旬,你又是谁?帅哥!你走错洞房啦?”看着眼前年轻又俊美的男子,她疑惑道。“墨家掌权人!墨景礼!”

  • 万古剑尊

    万古剑尊

    一代剑神楚云被手足兄弟背叛,意外重生在灵武大陆少年身上。大道有轮回,苍天饶过谁?战仇敌,灭魔族。这一世,我要铸造属于我的传奇…

  • 山君:你家娘子掉了

    山君:你家娘子掉了

    墨鋆是一块青黑色的石头,而他则是掌管一方的山君。他给了她修炼成人的机会,让她知晓情为何物,也让她知道了心碎是什么感觉。历尽波折,她终于等到了他的深情告白,可……

  • 猜你喜欢
  • java单例模式代码
  • 写一个简单的单例模式
  • 单例模式的应用场景
  • 单例模式线程安全
  • java单例模式实例
  • 单例模式的五种实现方式
  • unity单例
  • 单例模式代码
  • 单例模式和工厂模式区别
  • 热门推荐
  • チースッタカルヒ
  • 利得基金红包太恐怖了
  • きみがくれたもの
  • run out of sport
  • 宁萱改名刘敏
  • 鞋设计图铅笔手稿
  • atid 266 迅雷下载
  • scotch 3m
  • we chat blocking
  • unity pro universal
  • 枫叶 ss
  • be considered on
  • burning up 中文
  • l am in an
  • biz.util.chosen
  • AV五十路母超熟xf
  • 豆浆机怎么榨菠菜汁
  • persistent in
  • C and d
  • 华为红包助手不提醒 v9
  • All Right Reserved 强大网