Java单例模式

这篇具有很好参考价值的文章主要介绍了Java单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。

  • 是基于场景的解决方案
  • 具体场景具体分析

1、概念

目的:使得类的一个对象成为该类系统中的唯一实例。

定义:保证一个类有且只有一个实例,并且自行实例化向整个系统提供。

要点:

  1. 某个类只能有一个实例
  2. 必须自行创建实例
  3. 必须自行向整个系统提供这个实例

实现:

  1. 只提供私有的构造方法。
  2. 含有一个该类的静态私有对象。
  3. 提供一个静态的公有方法用于创建、获取静态私有对象。

2、代码实现方案

饿汉式实现:

SingletonOne类

package javase.javaDP;

/**
 * @author JumperSun
 * @date 2022-08-11-0:07
 * 单例模式-饿汉式:创建对象实例时直接进行实例化,典型的空间换时间(速度快,空间大)
 */
public class SingletonOne {
    // 1.创建类中的私有构造
    private SingletonOne() {}

    // 2.创建该类的私有静态实例
    private static SingletonOne instance = new SingletonOne();

    // 3.创建公有静态方法返回静态实例对象
    public static SingletonOne getInstance() {
        return instance;
    }
}

Test类

package javase.javaDP;

/**
 * @author JumperSun
 * @date 2022-08-11-0:14
 */
public class Test {
    public static void main(String[] args) {
        SingletonOne one = SingletonOne.getInstance();
        SingletonOne two = SingletonOne.getInstance();
        System.out.println(one);
        System.out.println(two);
        // 输出值相同,说明有效
    }
}
懒汉式实现:

SingletonTwo类

package javase.javaDP;

/**
 * @author JumperSun
 * @date 2022-08-11-0:18
 * 单例模式-懒汉式:类内实例对象创建时并不直接实例化,直到第一次调用get方法时,才能完成初始化操作。典型的时间换空间(时间长,空间小)
 */
public class SingletonTwo {
    // 1.创建类中的私有构造
    private SingletonTwo() {}

    // 2.创建静态的该类实例对象
    private static SingletonTwo instance = null;

    // 3.创建开发静态方法提供实例对象
    public static SingletonTwo getInstance() {
        if (instance == null) {
            instance = new SingletonTwo();
        }
        return instance;
    }
}

Test类

public class Test {
    public static void main(String[] args) {
        SingletonTwo one = SingletonTwo.getInstance();
        SingletonTwo two = SingletonTwo.getInstance();
        System.out.println(one);
        System.out.println(two);
        // 输出值相同,说明有效
    }
}
饿汉式PK懒汉式:

1.饿汉式线程安全

2.懒汉式存在线程风险

  • 同步锁
  • 双重校验锁
  • 静态变量类
  • 枚举

3、单例模式的特点及适用场景

优点:

1.在内存中只有一个对象,节省内存空间

2.避免频繁的创建销毁对象, 提高性能

3.避免对共享资源的多重占用

缺点:

1、扩展比较困难

2、如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,会造成对象状态丢失

适用场景:

1.创建对象时占用资源过多,但同时又需要用到该类的对象

2.对系统资源要求统一读写,如读写配置信息

3.当多个实例存在可能引起程序逻辑错误,如号码生成器

4、关于单例模式的常见问题

4.1 public static SingletonOne getlnstance(){}
A.该方法为什么用静态的?为什么要用这个类的类型作为返回值?

a. getInstance()方法的作用是实现该类对象的返回,因此需要设置该类类型作为方法返回值;至于static,则是因为对于单例模式而言,需要在类外能在无需产生对象实例的情况下,完成这个方法的调用,因此该方法需要设置为static。

B.只能叫这个名字吗?

b. 方法名并不限定,只是一种推荐命名,见名知义。

4.2 关于对象实例化、对象引用、对象声明的关系

完整的对象实例化的过程,可以分为声明和实例化两部分,这两步可以拆分也可以整合。

譬如:

// 对象声明
Cat one;
// 实例化
one=new Cat();

// 对象声明并完成实例化
Cat one=new Cat();

结合这段代码,one表示对象名,也可称为对象引用。

4.3 不是说,单例模式只能有一个对象吗,为什么在测试类里出现了两个singletonone的对象也不报错呢?
SingletonOne one = SingletonOne.getlnstance();
SingletonOne two = SingletonOne.getInstance();

所谓单例模式只能有一个对象,是指无论应用该类型产生多少对象,都是指向唯一的堆空间,所以测试类中,只是声明了两个对象的引用指向了同一内存空间,不会报错。

4.4 单例模式中的类成员是否需要加final修饰?从语法层面来说:

饿汉式:加入final修饰对于模式实现本身无影响

// 2、创建该类型的私有静态实例
private static final SingletonOne instance=new SingletonOne();
// 3、创建公有静态方法返回静态实例对象
public static SingletonOne getInstance(){return instance,
}

懒汉式:加入final修饰产生编译报错,提示信息为:无法对final修饰的成员进行操作。
原因是,final修饰的静态成员,如果在定义时未进行实例化,则需要在静态代码块中去实现,而不能到类方法中才进行实例化。

// 2、创建静态的该类实例对象
private static final SingletonTwo instance=null;
// 3、创建开放的静态方法提供实例对象
	public static SingletonTwo getInstance(){
		if( instance==null)
		instance=new SingletonTwo();
		return instance;
    }

从应用层面来说:

如果饿汉式的程序代码中不仅涉及创建对象及返回的功能,还包括其他的功能,譬如资源回收等,就不能假如final修饰,会影响程序功能实现。
总结:文章来源地址https://www.toymoban.com/news/detail-521654.html

  • 懒汉式中不能加入final。
  • 如果在饿汉式代码中,对类实例只涉及创建和返回方法,可以加入final修饰。

到了这里,关于Java单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java 设计模式——单例模式

    Java 设计模式——单例模式

    (1)单例模式 (Singleton Pattern) 是 Java 中最简单的设计模式之一。它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的

    2024年02月13日
    浏览(13)
  • Java设计模式-单例模式

    单例模式是一种设计模式,它确保一个类只能创建一个实例,并提供一种全局访问这个实例的方式。在Java中,单例模式可以通过多种方式来实现,其中最常见的是使用私有构造函数和静态方法实现 在Java中,实现单例模式的方式有多种,其中最常见的实现方式包括以下几种:

    2024年02月01日
    浏览(13)
  • Java单例模式详解--七种单例模式实现+单例安全+实际应用场景

    保证了一个类只有一个实例,并且提供了一个全局访问点。单例模式的主要作用是节省公共资源,方便控制,避免多个实例造成的问题。 实现单例模式的三点: 私有构造函数 私有静态变量维护对象实例 公有静态方法提供获取实例对象 七种单例模式实现 1.静态类:第一次运

    2024年02月04日
    浏览(13)
  • Java设计模式---单例 工厂 代理模式

    单例模式是设计模式中的一种,属于创建型模式。在软件工程中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于那些需要频繁实例化然后引用,且创建新实例的开销较大的类,例如数据库连接池、缓存管理等。 意图 :保证一个类仅有一个实例

    2024年01月24日
    浏览(12)
  • 设计模式篇(Java):单例模式

    设计模式篇(Java):单例模式

    上一篇:设计模式篇(Java):前言(UML类图、七大原则) 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 构造器私有化 (防止 new ) 类的内部创建对象 向外暴露一个静

    2024年02月11日
    浏览(18)
  • Java之单例模式

    Java之单例模式

    目录 一.上节内容 1.什么是线程安全 2.线程不安全的原因 3.JMM(Java内存模型) 4.synchronized锁 5.锁对象 6.volatile 7.wait()和notify() 8.Java中线程安全的类 二.单例模式 1.什么是单例 2.怎么设计一个单例 1.口头约定 2.使用编程语言的特性 三.饿汉模式 四.懒汉模式 1.单线程下的懒汉模

    2024年02月04日
    浏览(16)
  • java设计模式-单例

    单例模式是一种创建型设计模式,它可以保证一个类只有一个实例,并提供全局访问点。单例模式在实际开发中经常使用,可以避免多个实例引起的资源浪费和同步问题。常见的java实现方式有多种。 饿汉式单例模式是指在类加载时就创建了单例对象,因此在调用时不需要再

    2024年01月18日
    浏览(14)
  • Java单例模式

    设计模式 是软件开发人员在软件开发过程中面临的一般问题的解决方案。 是基于场景的解决方案 具体场景具体分析 1、概念 目的:使得类的一个对象成为该类系统中的唯一实例。 定义:保证一个类有且只有一个实例,并且自行实例化向整个系统提供。 要点: 某个类只能有

    2024年02月12日
    浏览(7)
  • 单例模式(java)

    目录 概述 结构 代码实现 饿汉式(静态变量) 饿汉式(静态代码块) 懒汉式(双重检查方式) 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创

    2024年02月16日
    浏览(3)
  • 【Java】单例模式

    【Java】单例模式

    设计模式 是在大量的 实践中总结 和 理论化 之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱。“套路” 经典的设计模式共有23种。每个设计模式均是特定环境下特定问题

    2024年02月16日
    浏览(5)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包