Design 单例模式
基本介绍
一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点。
单例模式应该是应用最广泛,实现最简单的一种创建型模式。
特点:全局唯一,允许更改
案例图示
一个应用中打开文件获得文件内容后仅占用一块内存,可以用单例模式实现:
优缺点
优点:
- 避免对资源的多重占用,如写入文件操作
- 节省内存
- 防止命名空间被污染
缺点:
- 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化
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实现单例模式:
...