单例模式如何保证实例的唯一性

前言

什么是单例模式

  • 指一个类只有一个实例,且该类能自行创建这个实例的一种创建型设计模式。
  • 使用目的:确保在整个系统中只能出现类的一个实例,即一个类只有一个对象。对于频繁使用的对象,"忽略"创建时的开销。
  • 特点:
    • 单例类只有一个实例对象;
    • 该单例对象必须由单例类自行创建;
    • 单例类对外提供一个访问该单例的全局访问点;

如何保证实例的唯一性

那么,如何保证实例的唯一性?

Java 的解决方案之一

对于 Java 来说,要确保类的构造方法是私有的,使用 static final 的私有成员变量存放这个唯一实例。我们还要提供一个获取实例的接口(由于我们要通过类名获取实例,所以接口方法是 static 的)。实现如下:

Java 复制代码
public class Singleton {
    private static final Singleton instance=new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

我们知道,对于 static 的变量,类所有的实例都可以共享这个变量,我们可以直接通过类名来访问它。再使用 final 修饰这个变量,使得它不能再被改变。

戳此处深入了解 →

Python 的解决方案之一

以下为 Python 使用装饰器实现的单例模式。这里将不可变的类地址存放在了 dict 中,值为那个唯一的实例。

python 复制代码
def Singleton(cls):
    _instance = {}

    def getInstance(*args, **kwargs):
        if cls not in _instance:
            _instance[cls] = cls()
        return _instance[cls]
    return getInstance

@Singleton
class test_singleton:
    def __init__(self):
        pass

def main():
    class1 = test_singleton()
    class2 = test_singleton()
    print('class1 id: {}, class2 id: {}'.format( id(class1), id(class2)))
    print(class1 == class2)

main()

# class1 id: 1814844368152, class2 id: 1814844368152
# True

参考

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

相关推荐
一勺菠萝丶1 小时前
MongoDB 常用操作指南(Docker 环境下)
数据库·mongodb·docker
Mitch3112 小时前
【漏洞复现】CVE-2015-3337 Arbitrary File Reading
elasticsearch·网络安全·docker·漏洞复现
Mitch3112 小时前
【漏洞复现】CVE-2015-5531 Arbitrary File Reading
web安全·elasticsearch·网络安全·docker·漏洞复现
沛沛老爹2 小时前
什么是 DevOps 自动化?
大数据·ci/cd·自动化·自动化运维·devops
vvw&2 小时前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
我自飞扬临天下3 小时前
Docker常用命令
docker
cronaldo914 小时前
研发效能DevOps: Vite 使用 Element Plus
vue.js·vue·devops
码农土豆5 小时前
PaddlePaddle飞桨Linux系统Docker版安装
linux·docker·paddlepaddle
明 庭15 小时前
Ubuntu下通过Docker部署NGINX服务器
服务器·ubuntu·docker
dessler17 小时前
Docker-run命令详细讲解
linux·运维·后端·docker