菜鸟学习java设计模式之单例模式

菜鸟学习Java设计模式之单例模式

单例模式是一种常见的设计模式,在Java中被广泛应用。它的主要特点是可以创建一个全局唯一的对象,并且该对象只会被创建一次,多次调用时直接返回已经创建好的对象,以此来保证系统中的唯一性和一致性。

实现单例模式的步骤

要实现一个单例模式,我们需要经过以下几个步骤:

  1. 构造函数需要设置为私有,以防止其他地方直接通过new来创建对象;
  2. 定义一个私有的静态对象作为单例的唯一实例;
  3. 提供一个公共的静态方法来获取该对象实例,确保每次获取的都是同一个对象。

Java中实现单例模式的最常见方式是采用饿汉式和懒汉式两种方式,下面我们分别来看一下它们的实现方式。

饿汉式单例模式

饿汉式单例模式在类被加载时自行实例化,并且保证了线程安全。因为只要使用了这个类,就必定会创建对应的实例,所以它的名称被称为饿汉式。

下面是一段饿汉式单例模式的示例代码:

public class Singleton {
    // 定义私有的静态实例对象,初始化为null
    private static Singleton instance = null;

    // 私有构造函数,防止外部new对象
    private Singleton() {
    }

    // 静态公有方法,以获取该类唯一实例对象
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在上面的示例代码中,我们定义了一个静态的私有实例对象instance,并将其初始化为null。同时,我们还定义了一个静态的公有方法getInstance(),该方法用于获取类的唯一实例对象。在getInstance()方法中,我们通过instance == null的条件判断,来判断该类是否已经被创建过对象实例。如果该类还未被创建过对象实例,就通过new Singleton()来创建一个新的实例,并将其赋值给instance,最后返回该实例即可。

懒汉式单例模式

懒汉式单例模式是在需要使用对象时才会去创建对象实例,此时才为对象分配内存等资源。懒汉式单例模式在用到对象时创建实例,但是需要防止多线程并发时出现问题。

下面是一段懒汉式单例模式的示例代码:

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在上面的实现方式中,我们同样将构造函数设置为私有的,同时定义了一个静态的私有实例对象instance,但是这里需要注意的是,在getInstance()方法中,我们使用了synchronized关键字,来保证在多线程并发时的线程安全。

单例模式优缺点分析

单例模式的优点:

  1. 它可以保证系统中的某个类只有一个实例,避免了对象的重复创建和内存的浪费;
  2. 由于它只会被实例化一次,所以可以节省系统的开销;
  3. 对象的唯一性可以有效地控制系统中的数据一致性和交互复杂性。

单例模式的缺点:

  1. 单例模式的应用范围比较局限,一般只适用于需要小量对象实例的场景;
  2. 单例模式的实现较为复杂,在多线程并发时需要考虑线程安全等问题,否则容易出现多线程并发时的问题。

示例说明

下面通过一个具体的示例来解释一下单例模式的应用。

比如在一款游戏中,我们需要对玩家进行统计,比如每天登录的人数、每个小时的游戏时长等,在不同的地方都需要用到这个统计对象,而且这个统计对象必须是全局唯一的,所以此时就可以采用单例模式来实现。

public class GameStatistics {
    private int dailyActiveUsers;
    private int hourlyPlayTime;

    // 饿汉式单例模式实现
    private static GameStatistics instance = new GameStatistics();

    private GameStatistics() {
    }

    public static GameStatistics getInstance() {
        return instance;
    }

    // 省略了getter和setter等方法
}

在上面的示例代码中,我们创建了一个GameStatistics类,用于记录游戏的统计信息。由于每个玩家在游戏中只会有一个统计对象,所以我们可以使用饿汉式的单例模式来实现。在GameStatistics类中,我们将构造函数设置为私有的,并定义一个静态的私有实例对象instance,同时还提供了一个公有的静态方法getInstance()来获取该实例对象。

在具体使用该单例实例对象时,我们可以通过GameStatistics.getInstance()来获取该对象,实现了全局唯一的效果。比如下面的代码片段就可以用来更新统计数据:

GameStatistics statistics = GameStatistics.getInstance();
statistics.setDailyActiveUsers(1000);
statistics.setHourlyPlayTime(3600);

在上面的代码片段中,我们首先通过GameStatistics.getInstance()来获取GameStatistics类的唯一实例对象,随后再通过setter方法来更新统计数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:菜鸟学习java设计模式之单例模式 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • ubuntusource命令

    以下是Ubuntu中的source命令的完整攻略,包括两个示例说明。 简介 source命令是Linux和Unix系统中的一个内置命令,用于在当前shell环境中执行指定的shell脚文件。它通常用于在当前shell环境中加载环境变量、别名、函数等。 语法 source命令的语法如下: source filename [arguments] 或者 . fil…

    other 2023年5月6日
    00
  • Java中spring读取配置文件的几种方法示例

    下面为您详细讲解“Java中spring读取配置文件的几种方法示例”的完整攻略。 一、准备工作 在开始之前,我们需要进行一些准备工作:创建一个Spring项目,并将依赖添加到项目中。 1. 创建Spring项目 在IDEA中,我们可以通过以下步骤来创建Spring项目:- 创建一个新的Project;- 选择Spring Initializr模板;- 配置项…

    other 2023年6月25日
    00
  • IIS 7.0 部署MVC

    Debian下配置防火墙iptables的完整攻略 在Debian系统中,iptables是一种常用的防火墙软件,可以用于保护服务器免受网络攻击。本文将介绍如何在Debian系统中配置iptables防火墙,包括以下步骤: 步骤一:安装iptables 在Debian系统中,可以使用以下命令安装iptables: sudo apt-get update su…

    other 2023年5月6日
    00
  • Vue使用axios发送请求并实现简单封装的示例详解

    Vue是一款流行的JavaScript框架,用于构建单页面应用程序。而axios则是一款流行的JavaScript库,用于与后端服务器进行数据交互。在进行Vue开发时,使用axios来发送数据请求是非常常见的操作。为了提高代码的复用性,我们通常会对axios进行简单的封装,以便在项目中随时使用。 以下是实现Vue中使用axios发送请求并进行简单封装的步骤和…

    other 2023年6月25日
    00
  • 怎样在局域网中绑定电脑的ip地址

    怎样在局域网中绑定电脑的IP地址 在局域网中,绑定电脑的IP地址可以帮助确保网络连接的稳定性和安全性。下面是一个完整的攻略,详细介绍了如何在局域网中绑定电脑的IP地址。 步骤一:打开网络设置 首先,打开电脑的网络设置。在Windows操作系统中,可以通过以下步骤打开网络设置: 点击任务栏右下角的网络图标。 在弹出的菜单中,选择“网络和Internet设置”。…

    other 2023年7月29日
    00
  • C语言结构体简单入门讲解

    C语言结构体简单入门讲解 什么是结构体? 结构体是C语言中的复合数据类型之一,它允许我们将不同类型的数据组合在一起,形成一个新的自定义数据类型。 结构体的定义方式为: struct 结构体名 { 结构体成员1; 结构体成员2; …… }; 结构体的使用 结构体的声明 声明一个结构体和声明一个变量类似,都需要指定数据类型和变量名。结构体的声明可以在函数…

    other 2023年6月27日
    00
  • Idea自定义方法注释模板的教程详解(去param括号、return全类名)

    Idea自定义方法注释模板的教程详解(去param括号、return全类名) 介绍 在IDE开发环境中,可以通过自定义方法注释模板来快速生成方法注释,提高代码编写效率。本教程将详细讲解如何自定义方法注释模板,并通过两个示例来说明如何去掉param括号和将return以全类名显示。 步骤 1. 打开IDEA设置 打开IDEA并导航到”File”->”Se…

    other 2023年6月28日
    00
  • 浅析Android Studio 3.0 升级各种坑(推荐)

    浅析Android Studio 3.0 升级各种坑(推荐) 为什么要升级Android Studio? 随着Android操作系统的不断升级和新功能的加入,开发者需要使用新的API才能保持应用程序的更新和市场竞争力。而新的API通常需要使用最新版本的Android Studio才能支持。此外,Android Studio 3.0带来了许多新的特性,如Kot…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部