單例模式如何保證實例的唯一性

前言

無知.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ā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容