前言

無知.jpg
什么是單例模式
- 指一個類只有一個實例,且該類能自行創(chuàng)建這個實例的一種創(chuàng)建型設(shè)計模式。
- 使用目的:確保在整個系統(tǒng)中只能出現(xiàn)類的一個實例,即一個類只有一個對象。對于頻繁使用的對象,“忽略”創(chuàng)建時的開銷。
- 特點:
- 單例類只有一個實例對象;
- 該單例對象必須由單例類自行創(chuàng)建;
- 單例類對外提供一個訪問該單例的全局訪問點;
如何保證實例的唯一性
那么,如何保證實例的唯一性?
Java 的解決方案之一
對于 Java 來說,要確保類的構(gòu)造方法是私有的,使用 static final 的私有成員變量存放這個唯一實例。我們還要提供一個獲取實例的接口(由于我們要通過類名獲取實例,所以接口方法是 static 的)。實現(xiàn)如下:
public class Singleton {
private static final Singleton instance=new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
我們知道,對于 static 的變量,類所有的實例都可以共享這個變量,我們可以直接通過類名來訪問它。再使用 final 修飾這個變量,使得它不能再被改變。
Python 的解決方案之一
以下為 Python 使用裝飾器實現(xiàn)的單例模式。這里將不可變的類地址存放在了 dict 中,值為那個唯一的實例。
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
參考
本文由博客群發(fā)一文多發(fā)等運營工具平臺 OpenWrite 發(fā)布