美文网首页
何为单例模式

何为单例模式

作者: __晨风__ | 来源:发表于2019-02-27 13:17 被阅读0次

    什么是单例模式?单例模式怎么应用?

    单例模式

    从字面意义来解释,就是单个对象模式,了解之后,就是只可以实例化一个对象的类

    如何实现单例模式?

    也就是说,怎么写一个只能实例化出一个对象的类。

    通常情况下,我们创建一个类,如果我们不指定构造函数,则系统会默认为我们添加一个隐式的无参构造函数,我们在外部创建该类的实例时可以创建无数个。

    如何才能保证只能实例化一个对象呢?

    我们开始一步步的去想方案,首先通常情况都是通过构造函数来实例化对象的,那么我们首先试着把构造函数动一下,先试着让构造函数不能够实例化对象,这个很简单就可以实现,私有化即可,就是说,把构造函数的默认修饰符public改为private就行,这样这个类就无法实例化对象了

    接下来我们继续想,如果我们在这个类里创建一个对象,供外部直接调用返回即可。所以我们自己在类里直接创建一个对象,通过方法返回对象。接下来问题又来了,我们怎么在外部调用该方法呢?我们知道,调用类的方法,有两种方式,通过对象实例化调用(现在这条路已经死掉了),第二种通过类名直接调用方法。类名直接调用,我们只有在该类方法为静态方法才可以调用,所以我们在该方法上加一个static关键字,可是返回的是对象引用。所以该对象的引用也必须为静态属性。这样我们就完成了类直接调用方法来返回对象的引用。

    static关键字所修饰的变量和方法,或者代码块在类加载的时候就会去执行。也即就是说,我们还没有到运行时就已经把对象创建完成,所以在单例模式里形象的称之为“饿汉模式”。

    和饿汉模式相对应有“懒汉模式”,懒汉模式是在前者基础上进一步优化,我们在类加载时不去创建对象,而是在调用方法时,事先判断有无实例,没有则去创建。这就引发了另外一个问题,如果多个线程同时调用了该实例创建方法,都走到了因为没有对象而需要创建对象的判断里,那么这时候对象就被多次创建了,返回的对象引用也就不同了。那这样就达不到我们想要的只能创建单个对象的当方式了。所以懒汉模式实际上因为是非线程安全,所以一般不推荐使用,不过我们也可以对懒汉模式进行改造,使其线程安全,这时候我们需要使用synchronized进行线程互斥就行。

    好了,以上我们就对单例模式有了一个较为清晰的了解,下面就是如何去实际项目中去运用

    通常如果我们在频繁创建对象,并且又很快进行回收的场景下,用单例模式去创建唯一对象,这样很大程度减少了系统资源的开销和GC回收的开销,对系统性能提升有很大的帮助。

    还有很多场景,我们需要不断的去思考运用

    相关文章

      网友评论

          本文标题:何为单例模式

          本文链接:https://www.haomeiwen.com/subject/nigxuqtx.html