Design 单例模式

基本介绍

一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点。

单例模式应该是应用最广泛,实现最简单的一种创建型模式。

特点:全局唯一,允许更改

案例图示

一个应用中打开文件获得文件内容后仅占用一块内存,可以用单例模式实现:

image-20210411235110756

优缺点

优点:

  • 避免对资源的多重占用,如写入文件操作
  • 节省内存
  • 防止命名空间被污染

缺点:

  • 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

Python实现

用Python的类实现单例模式:

#! /usr/local/bin/python3
# -*- coding:utf-8 -*-

from io import TextIOWrapper


class OpenFileSingleton(object):
    """实现单例模式的类"""

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            cls._instance = super(OpenFileSingleton, cls).__new__(cls)
        return cls._instance


class File(OpenFileSingleton):
    """应用类,只需要继承上面的类即可"""

    def __init__(self, *args, **kwargs):
        self._file = open(*args, **kwargs)

    def __getattr__(self, item):
        if hasattr(self._file, item):
            func = getattr(self._file, item)
            return func
        else:
            raise AttributeError("Non-existent attributes: %s" % item)

    def __del__(self):
        self.close()


if __name__ == '__main__':
    f1 = File("./test.txt", mode="r", encoding="utf8")
    print(f1.read())

    f2 = File("./test.txt", mode="r", encoding="utf8")
    print(f2.read())

    print(f1 is f2)

最终结果:

测试文本
测试文本
True

此外,也可以通过模块进行实现。

一个模块的加载仅在第一次时执行其内容,后续都不会再进行执行。

Python中实现单例模式的方式有5个,不过最常用的就是这2种。

Golang实现

用Golang实现单例模式:

...
posted @ 2021-04-12 14:34  云崖君  阅读(58)  评论(0编辑  收藏  举报