其他分享
首页 > 其他分享> > GOF--单例模式

GOF--单例模式

作者:互联网

文章目录


前言

单例模式是在处理数据的时候,为了保证数据的一致性。有时候我们需要让类的实例化只能有一次,但类的实例化有多个时就会造成数据出现多次,或者数据出现不同。


一、单例模式定义和特点

1.1、单例模式的定义

官方话:单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
我的理解的话,也是这样没毛病(哈哈哈哈),这个设计模式应该是最简单的,真的超级简单。

1.2、单例模式的特点

它主要有三大特点:

  1. 单例类只有一个实例对象;
  2. 该单例对象必须由单例类自行创建;
  3. 单例类对外提供一个访问该单例的全局访问点。

二、单例模式的优缺点

2.1、优点

单例模式的优点:

  1. 单例模式可以保证内存里只有一个实例,减少了内存的开销。
  2. 可以避免对资源的多重占用。
  3. 单例模式设置全局访问点,可以优化和共享资源的访问

2.2、缺点

单例模式的缺点:

  1. 单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径,违背开闭原则。
  2. 在并发测试中,单例模式不利于代码调试。在调试过程中,如果单例中的代码没有执行完,也不能模拟生成一个新的对象。
  3. 单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则
    所以一旦遇到这样的情况后,我们就必须根据需求合理的使用该设计模式,我总结了一下它适合用到的地方,一定是类不经常做出改变的,而且该类只出现一次,像登录界面的时候,就很合适用到这个设计模式。

三、创建单例模式的步骤

就只要3点要素:

  1. 将该类的构造方法设置为private(私有属性),这样做到原因是因为我们知道创建一个类的实例都是通过new它的构造方法,只要我们将它的构造方法设置为私有的,一般就调用不了,当然暴力反射肯定还是能够将这个破解。
  2. 该类本身要包含一个静态的实例,不然外界都无法new它,它就不能产生实例了,我们就没法用它,所以要设置一个它本身的静态的实例在它的里面。
  3. 提供一个静态的公用函数用于调用和创建该类的实例,这样外界,就只能通过这个公共函数来调用这个类了。
      这三点只是实现该设计的要素,我们要怎么处理该类不会产生多个实例了,因为即使将该类的构造方法设置为私有了,但是它本身还是有一个公共函数可以创建实例对象,所以这时候我们就需要在该类中判断一下,该实例对象是否已经用完,可以设置一个专属变量来判断,它是否为空来控制是否还要继续创建实例。

四、实现代码

public class LazySingleton {
     //保证 instance 在所有线程中同步(通俗来讲就是为了保障该类的实例只要一个)
    private static volatile LazySingleton instance = null; 
    //private 避免类在外部被实例化
    private LazySingleton() {
    } 
    //getInstance 方法前加同步(该方法就是用来创建和调用该类的实例对象)  
    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

总结

其实没多大总结的,记住创建的三大步骤,这个单例模式就是欧克的了。

标签:单例,--,创建,GOF,模式,instance,实例,该类
来源: https://blog.csdn.net/bankser/article/details/122225561