当前位置: 首页 > 科技观察

设计模式-单例设计模式

时间:2023-03-20 21:14:23 科技观察

单例模式单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式是一种创建模式,它提供了一种创建对象的最佳方式。此模式涉及一个类,该类负责创建自己的对象,同时确保只创建一个对象。此类提供了一种直接访问其唯一对象的方法,而无需实例化此类的对象。简单的说:一个单例类只能有一个实例。单例类必须创建自己的唯一实例。单例类必须将此实例提供给所有其他对象。单例模式看起来很简单,实现起来也很简单。单例模式是面试中的高频面试题。希望大家好好学习,掌握单例模式,提升自己的核心竞争力,为面试加分,顺利拿到offer。1.单例模式定义单例模式定义:是指一个类只有一个实例,类可以自己创建一个该实例的模式,并提供一个全局访问点来访问它。2.单例模式的作用单例模式主要用来解决一个全局使用的类被频繁创建和销毁的问题。核心思想:创建对象时,先判断对象是否已经存在,存在则返回,不存在则创建。关键代码是将构造函数私有化;使对象成为全局对象只会创建一个。3、单例模式应用场景对于Java来说,单例模式可以保证一个JVM中只存在一个实例。单例模式的应用场景主要有以下几个方面。对于一些需要经常创建的类,使用单例可以降低系统的内存压力,减少GC。当某个类只需要生成一个对象时,比如类中的班长,每个人的身份证号等。有些类在创建实例时占用资源较多,或者实例化时间较长,被频繁使用。当某个类需要被频繁实例化,并且创建的对象被频繁销毁时,比如多线程线程池、网络连接池等频繁访问数据库或文件的对象。对于一些控制硬件层面的操作,或者说从系统来讲应该是单一控制逻辑的操作,如果有多个instance,系统就会完全乱套。当需要共享对象时。由于单例模式只允许创建一个对象,因此共享该对象可以节省内存并加快对象访问速度。如Web中的配置对象,数据库的连接池等。3.单例模式结构单例模式的主要作用如下。单例类:包含一个实例并且可以自己创建该实例的类。访问类:使用单例的类。单例模式类图4.单例模式的实现单例模式通常有两种实现形式。4.1Lazy风格这种模式的特点是类加载时不产生单例,只有在第一次调用getlnstance方法时才创建这个单例。代码如下:publicclassLazySingleton{//确保实例在所有线程中同步privatestaticvolatileLazySingletoninstance=null;//private防止类被外部实例化privateLazySingleton(){}//获取单例对象publicstaticsynchronizedLazySingletongetInstance(){//GetInstance方法前面是同步if(instance==null){instance=newLazySingleton();}returninstance;}}如果你写的是多线程程序,请不要删除上面示例代码中的关键字volatile和synchronized,否则会出现线程不安全问题。如果不删除这两个关键字,可以保证线程安全,但是每次访问都要同步,会影响性能,消耗更多的资源。这就是惰性单例的缺点。Hungry-stylesingleton这种模式的特点是一旦类被加载就会创建一个单例,在调用getInstance方法之前确保单例已经存在。publicclassHungrySingleton{privatestaticfinalHungrySingletoninstance=newHungrySingleton();privateHungrySingleton(){}publicstaticHungrySingletongetInstance(){returninstance;}}饿式单例在创建类的同时创建了系统使用的静态对象,以后不会改变,所以它是线程安全的,可以直接用于多线程没有问题。除了上述之外,还有双重检查锁/双重检查锁(DCL,即双重检查锁定)方法、注册方法/静态内部类方法、枚举方法来实现单例。具体可以参考https://www.runoob.com/design-pattern/singleton-pattern.html总结单例模式的优点:单例模式可以保证内存中只有一个实例,减少内存高架。可以避免资源的多次占用。单例模式设置全局访问点,可以优化和共享资源访问。单例模式的缺点:单例模式一般没有接口,难以扩展。如果要扩展,除了修改原来的代码没有第二条路,违反了开闭原则。在并发测试中,单例模式不利于代码调试。在调试过程中,如果没有执行单例中的代码,就无法模拟出新的对象。单例模式的功能代码通常写在一个类中。如果功能设计不合理,很容易违反单一职责原则。