單例模式,是面向?qū)ο?3種模式中比較簡(jiǎn)單的一個(gè)洽瞬,幾乎每一個(gè)程序員都能快速默寫這個(gè)模式的范例秩仆,在此我就省略這個(gè)復(fù)制粘貼默寫的過(guò)程了瀑梗。
單例模式的任務(wù)是保證系統(tǒng)運(yùn)行過(guò)程中烹笔,只能有一個(gè)單例類的對(duì)象裳扯。而單例模式的核心就是控制創(chuàng)建對(duì)象的過(guò)程只執(zhí)行一次。
java中構(gòu)造方法是創(chuàng)建對(duì)象的必經(jīng)之路谤职。說(shuō)實(shí)話嚎朽,要不是學(xué)習(xí)python,用java這么多年我都沒(méi)想過(guò)java中創(chuàng)建對(duì)象與構(gòu)造方法執(zhí)行的先后順序柬帕,這應(yīng)該是很正常的哟忍,對(duì)java程序員來(lái)講執(zhí)行構(gòu)造方法就是創(chuàng)建對(duì)象,創(chuàng)建對(duì)象就是執(zhí)行構(gòu)造方法陷寝,兩者是等價(jià)的锅很。java對(duì)創(chuàng)建對(duì)象的控制是用私有化構(gòu)造方法,并開(kāi)放靜態(tài)方法獲取實(shí)例實(shí)現(xiàn)的凤跑。
python中有兩個(gè)方法與創(chuàng)建對(duì)象有關(guān)爆安,一個(gè)是__init__,另一個(gè)是__new__仔引。毫無(wú)疑問(wèn)扔仓,new是創(chuàng)建對(duì)象,而init是初始化對(duì)象咖耘。需要特別注意的是翘簇,new是需要返回值的,而返回的這個(gè)值就是創(chuàng)建出來(lái)的對(duì)象儿倒。于是我們可以寫出這樣的代碼:
class X:
def __new__(cls):
return Y()
class Y:
pass
x = X()
t = type(x)
print(t) # <class '__main__.Y'>
最終結(jié)果版保,x是一個(gè)Y對(duì)象,java是不支持這么玩的夫否。python對(duì)創(chuàng)建對(duì)象的控制是基于重新定義new方法彻犁,并在新定義的new方法中用邏輯實(shí)現(xiàn),在實(shí)現(xiàn)過(guò)程中還用到了面向?qū)ο蟮睦^承和多態(tài)的原理凰慈,相對(duì)java的單例實(shí)現(xiàn)來(lái)講要復(fù)雜一點(diǎn)汞幢,但沒(méi)有改變創(chuàng)建對(duì)象的習(xí)慣操作。
- 由上面的分析可以看出:
python中的__new__+__init__相當(dāng)于java的構(gòu)造方法微谓,并且java中這兩個(gè)是不能拆開(kāi)的
python在執(zhí)行new森篷,真正創(chuàng)建出對(duì)象前可以有邏輯,而java做不到這點(diǎn)
python不能將__new__+__init__私有化堰酿,而java可以