五种单件模式之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实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】

    PHP实现有序数组打印或排序的方法 在PHP中,实现有序数组的打印或排序,有多种方法可供选择。本文将分享其中两种具有代表性的方法,分别是使用sort()函数和array_multisort()函数,而且我们还提供了Python、C及Go语言的实现代码。下面,我们详细讲解这两种方法的实现步骤。 使用sort()函数 sort()函数是PHP中用来对数组进行排序…

    PHP 2023年5月26日
    00
  • PHP strripos函数用法总结

    当我们需要在一个字符串中找到子字符串的位置时,可以使用PHP中的strripos()函数。该函数可以忽略大小写,返回子字符串在父字符串中最后一次出现的位置。 下面是该函数的语法: strripos ( string $haystack , string $needle [, int $offset = 0 ] ) : int|false 它需要两个必要的参数…

    PHP 2023年5月26日
    00
  • 浅谈PHP设计模式的策略模式

    简介: 策略模式又叫做政策模式,用于如何组织和调用算法的,是属于行为型模式的一种。策略模式需要三个角色构成: Context 封装角色:也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。 Strategy 抽象策略角色:通常为接口,指定规则。 ConcreteStrategy 具体策略角色:实现抽象策略中的操作,该…

    PHP 2023年4月19日
    00
  • PHP JSAPI调支付API实现微信支付功能详解

    PHPJSAPI调支付API实现微信支付功能详解 微信支付是一种在线支付方式,可以通过微信公号、小程序等渠道进行支付。PHPJSAPI调支付API实现微信支付功能,是指使用PHP和JavaScript编写代码,调用微信支付API现在线支付功能。 实现步骤 以下是实现PHPJSAPI调支付API实现微信支付功能的步骤: 1. 获取微支付API密钥 在使用微信支…

    PHP 2023年5月12日
    00
  • PHP中的替代语法简介

    关于“PHP中的替代语法简介”的详细讲解,可以分为以下几个方面来讲解。 什么是PHP中的替代语法 在PHP中,可以使用替代语法来简化代码的书写。替代语法和常规语法本质上是相同的,只是在某些方面写法略有不同。常规语法中的大括号({ })用于标记代码块的开始和结束,而替代语法使用冒号(:)和关键字endif、endwhile和endforeach等来标记代码块的…

    PHP 2023年5月23日
    00
  • php中str_pad()函数用法分析

    PHP中str_pad()函数用法分析 简介 str_pad()是PHP中一个字符串处理函数,用于在字符串的左侧或右侧填充指定字符,使字符串达到指定的长度。 函数原型 str_pad(string $input, int $pad_length, string $pad_string = " ", int $pad_type = STR_…

    PHP 2023年5月26日
    00
  • php基础教程 php内置函数实例教程

    标题 PHP基础教程和PHP内置函数实例教程 概述PHP是一种常用的服务器端编程语言,它可以用来开发 Web 应用程序。PHP语言不需要编译,它是一种解释型语言。PHP基础教程和PHP内置函数实例教程是指在学习这种编程语言时,学习PHP的基础知识和内置函数的应用。 PHP基础教程 PHP基础教程主要包括以下知识点: PHP基本语法 学习PHP的第一个步骤是了…

    PHP 2023年5月24日
    00
  • 微课通如何录制微课 微课通录制电脑屏幕及网络课程教程

    微课通如何录制微课 简介 微课通是一款针对微课教学制作的移动应用,支持用户通过手机或平板电脑进行微课的制作和分享。本文将详细讲解微课通如何录制微课,包括录制电脑屏幕及网络课程教程等内容。 准备工作 在进行微课录制前,需要进行以下准备工作: 下载安装微课通应用; 准备要录制的内容,并确保电脑及网络连接良好; 准备好麦克风或外接麦克风,以确保录制的音频质量。 录…

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