详解Java设计模式之单例模式

详解Java设计模式之单例模式

1. 什么是单例模式?

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。

2. 何时使用单例模式?

当我们需要确保某个类只能有一个实例,并且该实例必须全局可访问时,我们可以使用单例模式。

3. 如何实现单例模式?

单例模式的实现一般包括两个步骤:

3.1 将类的构造器私有化

为了保证只有一个实例,我们需要阻止其他代码实例化该类,可以通过将类的构造器私有化来实现。

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return instance;
    }
}

上面代码中,Singleton类的构造器被私有化了,因此其他类无法通过new关键字实例化它。同时,该类定义了一个静态变量instance,并提供了一个公有的静态方法getInstance来获取该变量。

3.2 提供静态方法返回该类的唯一实例

在上面的Singleton类中,getInstance()方法返回该类唯一的实例,它是一个公有静态方法,其他代码可以通过它来获取唯一的实例。

4. 示例说明

下面我们通过两个示例来说明单例模式:

4.1 示例一:单线程下的单例模式

public class Singleton {
    private static Singleton instance = null;

    private Singleton(){}

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

// 示例用法
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

System.out.println(s1 == s2); // true

在单线程的环境中,单例模式的实现通常是最简单的,我们只需要在构造函数中将实例创建出来并提供一个静态方法来获取该实例即可。在上面的示例中,getInstance()方法中使用了懒汉式的单例模式实现,即第一次调用该方法时会判断实例是否被创建出来,如果没有则创建。

4.2 示例二:多线程下的单例模式

在多线程的环境下,单例模式需要考虑线程安全的问题。下面是一个使用双重检查锁定(Double-Check)的单例模式实现:

public class Singleton {
    private static volatile Singleton instance = null;

    private Singleton(){}

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

// 示例用法
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

System.out.println(s1 == s2); // true

上面代码中,getInstance()方法使用了双重检查锁定来保证线程安全,即先判断实例是否被创建出来(第一个if),如果没有,则进入同步代码块,再次判断实例是否被创建出来(第二个if),如果没有,则创建实例。使用volatile关键字可以保证在多线程环境下,对变量进行读操作时,总能获取最新的值,从而避免因为多个线程访问同一个变量而造成的不一致问题。

参考资料

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

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

相关文章

  • 微信js接口汇总及使用详解

    微信JS接口汇总及使用详解 微信JS接口是微信公众平台提供的一组JavaScript API,可以在微信公众号网页使用。本文将供微信JS接口的汇总及使用详解,包括口列表、接口使用方法、示说明等。 1. 接口列表 微信JS接口包括以下接口: 基础接口 wx.config wx.ready wx.error 分享接口 wx.onMenuShareTimeline…

    other 2023年5月8日
    00
  • 详解DevEco Studio项目构建讲解、编写页面、布局介绍、页面跳转

    详解DevEco Studio项目构建、编写页面、布局介绍、页面跳转攻略 1. 项目构建 在DevEco Studio中,可以按照以下步骤构建项目: 打开DevEco Studio,点击菜单栏的 \”File\” -> \”New\” -> \”Project\”。 在弹出的窗口中选择项目类型和模板,填写项目名称和路径,然后点击 \”Next\”…

    other 2023年10月13日
    00
  • win7更新kb4012212补丁后重启蓝屏怎么办?

    如果在更新 KB4012212 补丁后出现蓝屏,在下面的步骤中尝试解决: 步骤一:进入安全模式 1.重启计算机时,按住 F8 键,直到出现“高级启动选项”菜单。2.使用箭头键选择“安全模式”并按下 Enter 键。3.在安全模式下启动计算机后,执行以下步骤。 步骤二:卸载 KB4012212 补丁 在安全模式下使用以下步骤卸载 KB4012212 补丁: 1…

    other 2023年6月27日
    00
  • coach是什么牌子?

    Coach 是一家源自美国的时尚奢侈品牌,成立于1941年。该品牌以其优雅、时尚的设计造型,皮革制品和配件而闻名。下面详细讲解有关 Coach 的相关信息。 Coach 是什么牌子? 品牌历史和背景 Coach 成立于1941年,源自于位于纽约曼哈顿的手工制革工坊。创始人 Miles Cahn 和他的妻子 Lillian Cahn 最开始就是想设计出一个实用…

    其他 2023年4月16日
    00
  • h5新增的input类型

    以下是关于“H5新增的input类型”的完整攻略,包括新增的input类型介绍、示例说明等。 新增的input类型 HTML5中新增了一些input类型,用于更方便地处理表单。以下是一些常用的新增input类型: color:用于选择颜色的输入框。 date:用于选择日期的输入。 datetime-local:用于选择日期和时间的输入框。 email:用于输…

    other 2023年5月7日
    00
  • GTA5兄弟有难任务无法上卡车怎么解决_上卡车跳出的快速解决方法

    Title: GTA5兄弟有难任务无法上卡车怎么解决 问题现象描述 在GTA5游戏的“兄弟有难”任务中,玩家遇到了上不去卡车的问题。当玩家站在卡车旁边并尝试按下“F”键上车时,角色会走到卡车上方但无法上车,此时玩家会被提示按下“Shift + F”键可以进入卡车,但这样操作时,角色只会瞬间跳上并立即从卡车顶部跳下来。 解决方法 这个问题是由于游戏在处理角色与…

    other 2023年6月27日
    00
  • iOS开发之使用Ad Hoc进行测试

    Ad Hoc是一种iOS应用程序分发方式,可以让开发者将应用程序分发给特定的用户或设备进行测试。本文将详细讲解如何使用Ad Hoc进行测试,并提供两个示例说明。 准备工作 在使用Ad Hoc进行测试之前,需要进行以下准备工作: 获取设备UDID:在使用Ad Hoc分发应用程序之前,需要获取测试设备的UDID。可以通过连接设备到电脑上,使用iTunes或Xco…

    other 2023年5月5日
    00
  • iar教程之iar下载和调试

    下面是关于“IAR教程之IAR下载和调试”的完整攻略: 1. IAR下载和调试 IAR是一款常用的嵌入式开发工具,它可以用来编编译、下载和调试嵌入式系统的代码。在使用IAR进行开发时,需要进行下载和调试操作,以便将代码下载到标设备中并进行调试。下面是IAR下载和调试的详细步骤。 2. IAR下载 IAR下载是将译好的代码下载到标设备中的过程。在进行IAR下载…

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