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

前言

什么是单例模式

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

如何保证实例的唯一性

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

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

相关推荐
你才是臭弟弟13 小时前
Docker 容器使用运行镜像(Windows)
运维·docker·容器
IT运维爱好者13 小时前
【Docker】解决Docker容器时间与宿主机时间不一致的几种方法
docker·容器
鸠摩智首席音效师13 小时前
如何在 Docker 容器下运行 cronjob ?
运维·docker·容器
Yawesh_best14 小时前
摆脱命令行!Docker Compose UI + 内网穿透,随时随地管理容器
ui·docker·容器
江湖有缘14 小时前
自托管在线演示文稿平台:PPTist + Docker 部署实战
docker·容器·eureka
春日见15 小时前
三分钟安装window Docker,并与Ubuntu(WSL)建立连接
linux·人工智能·windows·驱动开发·机器学习·docker·容器
白衣衬衫 两袖清风15 小时前
Docker日志清理,防止磁盘被json.log撑爆
docker·容器·json
biubiubiu070615 小时前
Devops(gitlab和jenkins)安装
运维·devops
LI JS@你猜啊15 小时前
【本地搭建项目运行服务器 + 免费公网地址映射 + Docker】
运维·服务器·docker
Wpa.wk15 小时前
Docker原理和使用场景(网络模式和分布式UI自动化环境部署)
linux·经验分享·分布式·测试工具·docker·性能监控