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

yizhihongxing

菜鸟学习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日

相关文章

  • k2bpm介绍(2)

    以下是k2bpm介绍的完整攻略: 1. 什么是k2bpm k2bpm是一款基于K2平台的业务流程管理软件,它可以帮助快速构建和管理业务流程。k2bpm提供了一系列的工具和功能,包括流程建模、流执行、流程监控和流程优化等,可以帮助企业提高业务效率和管理水平。 2. k2bpm主要功能 k2bpm的主要功能包: 流程建模:提供了可视化的流程建模工具,可以快构建业…

    other 2023年5月8日
    00
  • 一键自动更改本机IP地址BAT执行脚本 非常好用

    一键自动更改本机IP地址BAT执行脚本攻略 本攻略将详细介绍如何使用一键自动更改本机IP地址的BAT执行脚本。该脚本可以帮助用户快速更改本机的IP地址,提供了简单且方便的方式来管理网络设置。 步骤一:创建BAT执行脚本 打开任意文本编辑器,例如记事本。 在编辑器中输入以下内容: @echo off echo 正在更改IP地址… netsh interfa…

    other 2023年7月30日
    00
  • c# 委托详解

    C# 委托详解 什么是委托? 在C#中,委托(Delegate)是一种特殊的类型,它可以用来引用具有相同参数列表和返回类型的方法。委托提供了一种方便的方式来封装方法,并允许将方法作为参数传递给其他方法。委托是C#中实现事件和回调机制的基础。 委托的声明和使用 委托的声明 在C#中,委托的声明需要定义委托的名称、参数列表和返回类型。通常,我们会使用自定义委托类…

    other 2023年6月28日
    00
  • C语言入门之浅谈数据类型和变量常量

    C语言入门之浅谈数据类型和变量常量 数据类型的概念 在C语言中,数据类型是指变量所存储数据的类型。C语言中的数据类型可以大致分为基本数据类型和派生数据类型。 基本数据类型 C语言的基本数据类型有:整型(int)、字符型(char)、浮点型(float)和双精度浮点型(double)。 整型:int类型的变量只能存储整数。int类型使用4个字节(32位)存储,…

    other 2023年6月27日
    00
  • matlab中函数fscanf

    以下是详细讲解“matlab中函数fscanf的完整攻略”的标准Markdown格式文本,包含两个示例说明: matlab中函数fscanf的完整攻略 在Matlab中,函数fscanf可以用于读取文件中的数据。本攻略将介绍如何使用fscanf函数读取文件中的数据。 步骤一:打开文件 使用fscanf函数读取文件中的数据,需要先打开文件。可以使用fopen函…

    other 2023年5月10日
    00
  • html+css实现赛博朋克风格按钮

    HTML+CSS实现赛博朋克风格按钮攻略 1. 创建HTML结构 首先,我们需要在HTML中创建所需的按钮结构。可以使用 <button> 或 <a> 标签作为按钮,这取决于你的需求。下面是一个示例: <button class="cyberpunk-button">按钮文本</button&gt…

    other 2023年6月28日
    00
  • CentOS 7.2系统安装步骤

    以下是CentOS 7.2系统安装步骤的完整攻略,包括准备工作、安装步骤、示例说明和注意事项。 准备工作 以下是安装CentOS 7.2系统前需要准备的工作: 下载CentOS 7.2镜像:从CentOS官网下载CentOS 7.2镜像文件。 制作启动盘:使用制作启动盘工具,将CentOS 7.2镜像写入U盘或DVD。 准备安装设备:准备一台计算机或虚拟机,…

    other 2023年5月6日
    00
  • sql根据表名获取字段及对应说明

    要根据表名获取字段及对应说明,需要使用SQL语句中的“DESCRIBE”或是“SHOW COLUMNS”命令。 下面分别介绍这两个方法的使用步骤。 Method 1: 使用DESCRIBE命令 使用DESCRIBE命令,可以查询指定表格下的所有字段信息,包括字段名、数据类型、键类型、是否为null等。 查看表结构 使用DESCRIBE命令可以查看指定表的结构…

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