lazy形容詞,懶惰的,毫無疑問是一個(gè)貶義詞。但是,對(duì)于計(jì)算機(jī)領(lǐng)域,lazy卻是非常重要的優(yōu)化思想:把任務(wù)推遲到必須的時(shí)刻,好處是避免重復(fù)計(jì)算,甚至不計(jì)算。本文的目的是拋磚引玉,總結(jié)一些編程中的lazy idea,以期有一些啟發(fā)。google “l(fā)azy”這個(gè)單詞,在計(jì)算機(jī)領(lǐng)域高頻出現(xiàn)三個(gè)詞:lazy loading(惰性加載)、lazy initializing(惰性初始化)、lazy evaluation(惰性求值),本文并不刻意區(qū)分,因?yàn)椴还苁莑oading、initializing還是evaluation都需要耗費(fèi)計(jì)算機(jī)的運(yùn)算資源,而且,loading(initializing)也是某種意義上的evaluation。
lazy ideas:
在GOF的設(shè)計(jì)模式中,并沒有一個(gè)叫“l(fā)azy loading”之類的設(shè)計(jì)模式,但是其思想貫穿在很多設(shè)計(jì)模式中。其中比較明顯的就是singleton和proxy模式。
singleton
單例模式的實(shí)現(xiàn)一般都有兩種方式,要么在調(diào)用之前就創(chuàng)建好單例對(duì)象(eager way),要么在第一次調(diào)用的時(shí)候生成單例對(duì)象(lazy way),兩者對(duì)象的代碼大致是這樣的:
1 class eager_meta(type): 2 def __init__(clz, name, bases, dic): 3 super(eager_meta, clz).__init__(name, bases, dic) 4 clz._instance = clz() 5 6 class singleton_eager(object): 7 __metaclass__ = eager_meta 8 9 @classmethod10 def instance(clz):11 &nbs