单利模式,通用代码学习笔记--单利模式

看到这段代码,胸口就很闷,完全和我理解的类不一样,类自己怎么调用自己了呢,遍查Google,得出几项肯定的和瞎凑的理解
public class ResourceManagerWrapper
{
private volatile static ResourceManagerWrapper instance = null;
private static object locker = new Object();
public static ResourceManagerWrapper Instance
{
get
{
if (instance == null)
{
lock (locker)
{
if (instance == null)
{
instance = new ResourceManagerWrapper();
}
}
}
return instance;
}
}
private ResourceManager resourceManager;
肯定的
这是一个单例模式,
以下是百度维基百科的解释

单例模式

维基百科,自由的百科全书
单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。
这个是懂了,因为这个程序是用来多语言设置的,想想有道理,可以理解
可是单例模式为什么允许自己调用自己呢?
我Google出来的答案是:
这与单不单例没关系,这个是概念上还没有理解正确。
class person
{ person a =new person();
}
这样编程是允许的,类是模板,这样写并不能理解为person 在实例化自己。可以理解为即使放在这里它也没运行,也不实例化,类必须通过构造函数实例化,实例化就是在内存中为非静态成员新分配一块存储,a现在也只是一个非静态成员而已,只有当开始new person()时,类才开始实例化,仅是写在类里,并没有任何动作。a只是作为实例化的一员参与了最后的分配存储,最终到底是如何分配a,这个和鸡生蛋,蛋生鸡的概念一样,是由上帝,即csharp研发人员去解决这个顺序的。我们不用管了。
恩,这个解释目前我是信了,感觉自己骗自己了,至于你信不信,请留下您的宝贵意见。
Tags:  什么是单利 单利和复利 单利复利 单利设计模式 单利模式

延伸阅读

最新评论

发表评论