欢迎来到天天文库
浏览记录
ID:14322253
大小:58.00 KB
页数:26页
时间:2018-07-27
《c#里实现单件模式的几个方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C#里实现单件模式的几个方法为什么要用单件模式和C#里实现单件模式的几个方法2009-08-2412:30P.M.前天HLF问我为什么要用单件模式,还有我把单件模式用在了哪里。当时跟他说的不是很好,这里补充下。使用单件模式的地方:1.项目的某个地方需要有一个统一的类来管理涉及到的资源2.类的设计和项目的实际要求不允许重复生成同一个类。考虑一下你正在写一个函数,这个函数通过调用数据库访问层的类的相关函数来实现数据的访问,并且这些类里面的函数不是静态的。这意味着你必须在使用的时候实例化对应的类。但是这个业务逻辑层是可能被多个线程同时访问的。那么在这种情况下使用
2、单件模式和不使用单件模式有什么区别呢。这就好比做公共运输工具与私家车的区别。私家车是爽点,但是大量使用会占用很多的交通资源和石油资源;而公共运输工具则可以在载更多人的同时使用的相对较少资源。同时,如果你写的类里面要求实例化后要对一些生成的资源进行统一的管理,那么多次生成一个类与你的想法相违背的。生成许多事例的后果可能是资源管理非常不便,还有就是资源的同步更新会有问题。C#中实现单件模式的方法有个很简单的方法:staticObjecta;staticsyncObject=newObject();publicstaticObjectInstance{get{l
3、ock(syncObject){if(a==null){a=newObject();}}returna;}}这段代码通过lazy-load返回了一个Object类型的对象,通过判断a是否为null再去生成Object实例。注意到这个代码中锁住了一个object对象,这样做的原因是在多线程访问的时候,如果不锁住的话,那么a会被创建几次,并最终返回最后创建的那个实例,这显然不是我们的目的,因此在这里我们把a锁住。但是这样有个问题,每次使用的话都会锁一次,也就是无论你何时调用这个属性,syncObject对象首先都会被锁上,这样的话效率明显就下来了。因此,做个小
4、小的改进,变成了所谓的double-check方式:staticObjecta;staticvolatilesyncObject=newObject();publicstaticObjectInstance{get{if(a==null){lock(syncObject){if(a==null){a=newObject();}}}returna;}}这样的好处是,只要a被生成了就不会再被锁住,因此上面提到的烦恼也就可以解决。Volatile关键字告诉编译器字段可能会被多个并发执行的线程修改,不需要做编译优化(一般都做单线程访问的优化)。有了volatile
5、,在syncObject被锁后,新加入的线程看到的a都会是null。不过《设计模式--基于CSharp的工程化实现及扩展》一书提到过C#版的单件模式实现。毕竟上面两种方式都是从C++/Java方面依葫芦画瓢复制过来的,看起来总是稍显烦了点。因此,改书店作者给出了一个C#版的单件模式的实现方法。classSingleton{privateSingleton(){}publicstaticreadOnlySingletonInstance=newSingleton();}很简洁吧?不过他的确能够实现线程安全的单件模式。至于为什么我在这里就不多叙述了,需要的话你
6、可以去看这本书,书里面有清晰地讲解。作标记是不好的,你刚才那个是一个标准的单件设计模式,不过得改一下。publicclassSomeClass{privatestaticSomeClass_instance;protectedSomeClass{//doyoudo;}publicstaticSomeClassgetInstance(){if(_instance==null){_instance=newSomeClass();}return_instance;}}使用时请这样使用SomeClassa=SomeClass.getInstance();单件模式(
7、SingletonPattern)——.NET设计模式系列之二Terrylee,2005年12月07日概述Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任。从另一个角度来说,Singleton模式其实也是一种职责型模式。因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时
8、它也肩负了行使这种权力的职责!意图保证一个类仅有一个实例,并提供一
此文档下载收益归作者所有