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

yizhihongxing

五种单件模式之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的十个高级技巧(上中下)第1/3页

    PHP的十个高级技巧(上中下)第1/3页 简介 这篇文章会介绍PHP的十个高级技巧,帮助开发者更好地理解PHP的能力和应用场景。 高级技巧1:命名空间 命名空间可以定义代码库中的不同部分,以避免命名冲突和提高代码的可重用性。 示例1 以下代码展示了如何使用命名空间来定义代码库中的不同文件夹。 <?php // 定义App命名空间 namespace A…

    PHP 2023年5月23日
    00
  • PHP strstr 函数判断字符串是否否存在的实例代码

    当我们在处理字符串时,常常需要查找一个字符串在另一个字符串中是否存在。PHP提供了一些内置函数用于此目的,其中一个就是strstr()函数。 strstr()函数用于在一个字符串中查找另一个字符串第一次出现的位置,并返回该位置后面的所有字符。如果未找到,则返回false。 以下是strstr()函数的语法: strstr(string $haystack, …

    PHP 2023年5月26日
    00
  • PHP学习文件处理与文件上传 课件

    PHP学习文件处理与文件上传 课件攻略 文件处理 对于文件的操作可以使用PHP内置的文件系统函数,可以创建、读取、写入、重命名、删除等。下面是一些常用的文件操作函数: 文件打开和关闭 函数 描述 fopen() 打开文件或URL fclose() 关闭打开的文件资源 示例说明1: $file = fopen("example.txt", …

    PHP 2023年5月26日
    00
  • PHP explode()函数用法、切分字符串

    好的。首先,我们先来了解一下explode()函数的作用。该函数的作用是将一个字符串按照指定的分隔符进行切分,返回一个数组,每个元素都是切分后的子串。下面是该函数的基本语法: array explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] ) 参数说明: $de…

    PHP 2023年5月25日
    00
  • php使用curl和正则表达式抓取网页数据示例

    下面是“php使用curl和正则表达式抓取网页数据示例”的完整攻略: 一、curl的基本用法 curl是一个非常常用的工具,它可以通过网络协议,向网络服务器发送请求,从而获取服务器返回的数据。在PHP中,可以使用curl库来发起网络请求,并获取服务器返回的数据。 1.1 基本的curl请求 下面是一个基本的curl请求的代码示例: $url = ‘https…

    PHP 2023年5月27日
    00
  • PHP回调函数概念与用法实例分析

    首先,回调函数是一种特殊的函数,它可以作为参数传递给另一个函数,在另一个函数执行完特定操作后,回调函数会被自动调用,从而完成特定的任务。 在 PHP 中,回调函数经常被用在事件驱动编程、异步编程、模板渲染等场景中。下面我们来介绍一下 PHP 回调函数的概念和用法,并结合示例进行分析。 概念 在 PHP 中,回调函数是一种特殊的函数,它可以作为参数传递给另一个…

    PHP 2023年5月27日
    00
  • 微信小程序应用怎么分享?微信小程序分享给朋友的教程

    关于微信小程序的分享,我们可以通过两种方式实现: 方式一:设置页面的分享配置 如果我们想要在小程序内分享页面给朋友,我们可以设置页面的分享配置。具体步骤如下: 在小程序的 app.json 文件中的 pages 数组中,增加我们要设置分享的页面路径; 在小程序的页面 JS 文件中,增加 onShareAppMessage 函数,该函数返回一个对象,里面设置分…

    PHP 2023年5月23日
    00
  • ThinkPHP框架安全实现分析

    ThinkPHP框架安全实现分析 前言 ThinkPHP是一款PHP语言的开源Web应用框架,其为Web应用开发提供了全方位的支持,包括MVC、ORM、路由、视图、缓存、验证、模板引擎等功能。在使用框架时,我们需要注意其中的安全问题,对框架的安全实现进行分析,可以帮助我们更好地保障应用程序的安全性。 Session处理 Session是Web应用中用于存储用…

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