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

前言

什么是单例模式

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

如何保证实例的唯一性

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

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 发布

相关推荐
漫无目的行走的月亮3 小时前
在Docker中运行微服务注册中心Eureka
docker
大道归简6 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
苦逼IT运维6 小时前
YUM 源与 APT 源的详解及使用指南
linux·运维·ubuntu·centos·devops
zeruns8027 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
爱跑步的程序员~7 小时前
Docker
docker·容器
疯狂的大狗7 小时前
docker进入正在运行的容器,exit后的比较
运维·docker·容器
长天一色8 小时前
【Docker从入门到进阶】01.介绍 & 02.基础使用
运维·docker·容器
伊玛目的门徒8 小时前
docker 搭建minimalist-web-notepad
运维·docker·notepad
theo.wu10 小时前
使用Buildpacks构建Docker镜像
运维·docker·容器
wusam19 小时前
螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习04(环境准备)
学习·docker·centos