单例模式的使用及实现

核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点

什么时候使用单例模式?

举一个小例子,在我们的windows桌面上,我们打开了一个回收站,当我们试图再次打开一个新的回收站时,Windows系统并不会为你弹出一个新的回收站窗口。也就是说在整个系统运行的过程中,系统只维护一个回收站的实例。这就是一个典型的单例模式运用。

我们在实际使用中并不存在需要同时打开两个回收站窗口的必要性。假如我每次创建回收站时都需要消耗大量的资源,而每个回收站之间资源是共享的,那么在没有必要多次重复创建该实例的情况下,创建了多个实例,这样做就会给系统造成不必要的负担,造成资源浪费。

同样,对于一些应用程序的日志应用,或者web开发中读取配置文件都适合使用单例模式,如HttpApplication 就是单例的典型应用。

从上述的例子中我们可以总结出适合使用单例模式的场景和优缺点:  

适用场景: 1.需要生成唯一序列的环境

                   2.需要频繁实例化然后销毁的对象。

                   3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 

                   4.方便资源相互通信的环境


 优点:1.实现了对唯一实例访问的可控

               2.对于一些需要频繁创建和销毁的对象来说可以提高系统的性能。

 缺点:1. 不适用于变化频繁的对象
               2.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出。

               3.如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失。

实现 :  使用静态内部类,借助JVM。

这种内部类与其外部类之间并没有从属关系,加载外部类的时候,并不会同时加载其静态内部类,只有在发生调用的时候才会进行加载,而且线程调用内部静态类,虚拟机只会初始化一次,当静态内部类下次被调用,发现已经被初始化了,就直接引用了

code:

public class ClassInnerClassDanli {
    public static class DanliHolder{
        private static ClassInnerClassDanli dl = new ClassInnerClassDanli();
    }

    public static ClassInnerClassDanli getInstance(){
        return DanliHolder.dl;
    }

    private ClassInnerClassDanli(){}
}



refer:https://blog.csdn.net/Mr_PH/article/details/77898243 

猜你喜欢

转载自blog.csdn.net/BrianWey/article/details/83339188