五种单件模式之Singleton的实现方法详解

五种单件模式之Singleton的实现方法详解

什么是单例模式?

单例模式是一种常用的设计模式之一,它的目的在于保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。

Singleton模式的实现方法

方法一:懒汉式

在第一次调用getInstance()方法时,才会创建实例进行初始化。

示例代码:

class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

优点:单例对象的创建是在需要的时候进行的,实现了“延迟加载”,节约了系统资源。

缺点:线程不安全,在多线程的情况下,可能会创建多个实例。

方法二:饿汉式

在类加载时就创建了实例,但是getInstance()方法仍然需要访问全局实例变量。

示例代码:

class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

优点:线程安全。在多线程的情况下,不会出现创建多个实例的问题。

缺点:无论是否需要使用到该实例,都会在类加载时创建实例,有可能会造成一定的资源浪费。

方法三:双重检查锁式

在方法一的基础上进行改进,增加了synchronized锁。

示例代码:

class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

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

优点:线程安全。在多线程的情况下,不会出现创建多个实例的问题。

缺点:synchronized锁降低了系统的并发性能,同时也增加了系统的复杂度。

方法四:静态内部类式

使用静态内部类来实现单例模式,当第一次加载内部类时才会创建实例。

示例代码:

class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton() {}

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

优点:线程安全,实现了“延迟加载”,节约了系统资源。

缺点:无

方法五:枚举式

Java 5之后,增加了枚举类型。枚举类型本身就是单例模式,所以在需要使用单例时,可以直接使用枚举。

示例代码:

enum Singleton {
    INSTANCE;

    public void doSomething() {
        // do something
    }
}

优点:线程安全,防止反射和序列化的单例破坏。

缺点:无

总结

单例模式是一种常用的设计模式,可以保证系统中某个类仅有一个实例,并提供一个全局访问点,并且可以通过不同的实现方式满足不同的需求。例如,如果需要实现“延迟加载”功能,可以使用懒汉式、静态内部类式等方式。

示例1:使用饿汉式创建线程安全的单例对象。

class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

// 使用方法
Singleton singleton = Singleton.getInstance();

示例2:使用双重检查锁式创建线程安全的单例对象。

class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

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

// 使用方法
Singleton singleton = Singleton.getInstance();

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:五种单件模式之Singleton的实现方法详解 - Python技术站

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

相关文章

  • php利用array_search与array_column实现二维数组查找

    当我们需要在二维数组中查找指定元素或元素集合时,可以采用array_search与array_column函数进行快速匹配。 下面是实现该过程的具体步骤: 1.构建指定二维数组 需要先创建一个需要查找的二维数组,例如: $users = [ [‘id’=>1, ‘name’=>’Tom’, ‘age’=>20], [‘id’=>2, …

    PHP 2023年5月26日
    00
  • php 删除一维数组中某一个值元素的操作方法

    要删除一个一维数组中的某一元素,可采取以下步骤: 使用内置函数 unset() 删除对应下标的元素。 若需保持下标连续,可使用内置函数 array_values() 重新索引数组。 下面分别对这两个步骤做详细讲解,并提供两条示例作为参考: 1. 使用unset()删除元素 unset() 函数可用于删除PHP中的变量。即使它是数组中的元素,该函数也可以使用。…

    PHP 2023年5月26日
    00
  • PHP文件操作实例总结【文件上传、下载、分页】

    让我们来讲解一下“PHP文件操作实例总结【文件上传、下载、分页】”的攻略。 文件上传 HTML代码 在HTML中,我们可以通过<input>标签实现文件上传。 <form enctype="multipart/form-data" action="upload.php" method="PO…

    PHP 2023年5月23日
    00
  • php实现网页缓存的工具类分享

    下面是详细的 “php实现网页缓存的工具类分享” 教程。 1. 背景 为了提高网站的响应速度和性能,我们可以使用缓存技术。网页缓存是在服务器端缓存生成的HTML页面,当下次客户端请求相同页面时,可以直接从缓存中读取,减少数据库或计算机资源的压力,提升网站的性能。 2. 方案 2.1 方案一:使用PHP内置函数实现网页缓存 在 PHP 中,我们可以使用 ob_…

    PHP 2023年5月27日
    00
  • php中的三元运算符使用说明

    下面是 “PHP中的三元运算符使用说明” 的完整攻略: 什么是三元运算符 PHP中的三元运算符(?:)用于简洁地对比两个值,并且返回一个条件成立或不成立的值。它的基本语法如下: $variable = (condition) ? true_value : false_value; 其中,($condition)是需要判断的条件语句,true_value的值在…

    PHP 2023年5月26日
    00
  • PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析

    PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析 背景 在开发的过程中,我们通常需要用到数据持久化,也就是将应用程序数据存储到数据库中。这时候,我们就需要用到访问数据库的相关代码。但是,直接将数据库操作的代码写在应用程序中会导致代码耦合度高、代码冗长等问题。因此,我们需要一种将数据库操作和应用程序解耦的方式来提高代码的可读性、可维护性和可扩展性,…

    PHP 2023年5月27日
    00
  • 简单的php+mysql聊天室实现方法(附源码)

    下面详细讲解“简单的php+mysql聊天室实现方法(附源码)”的完整攻略。 简述 本文所介绍的方法是一种使用php和mysql实现聊天室功能的方法。实现的核心是通过Ajax技术实现实时聊天。 环境要求 服务器需支持php和mysql; 推荐使用XAMPP或WAMP等本地服务器环境; 推荐使用最新版本的Chrome浏览器。 实现步骤 1. 创建数据库和表 首…

    PHP 2023年5月23日
    00
  • 一个PHP数组应该有多大的分析

    当我们设计一个 PHP 数组时,需要考虑该数组的预期大小。这有助于我们最大限度地利用计算机资源,从而提高代码效率。在确定数组大小之前,我们应该分析以下两个因素: 数据量:数组可存储的数据量直接影响内存使用量。因此,我们需要预测数组的最大可能数据量,以避免在执行 PHP 脚本时耗尽内存。 数组操作:需要考虑数组是如何被使用的。例如,在一个数组中添加或删除元素,…

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