サマリー:?jiǎn)卫J酱_保一個(gè)特殊類的實(shí)例是獨(dú)一無二的(它是這個(gè)類的唯一實(shí)例),并且這個(gè)實(shí)例易于被訪問。解決方案1)全局變量:一個(gè)全局變量使得一個(gè)對(duì)象可以被訪問,但它不能防止你實(shí)例化多個(gè)對(duì)象。因?yàn)槟愕娜魏未a都能修改全局變量,這將不可避免的引起更多調(diào)試的意外。換句話說,全局變量的狀態(tài)總是會(huì)出現(xiàn)一些問題的。2)類構(gòu)造函數(shù)私有和類自身的靜態(tài)方法:讓類自身負(fù)責(zé)保存它的唯一實(shí)例(靜態(tài)變量)。這個(gè)類可以保證沒有其他實(shí)例可
單例模式
確保一個(gè)特殊類的實(shí)例是獨(dú)一無二的(它是這個(gè)類的唯一實(shí)例),并且這個(gè)實(shí)例易于被訪問。
解決方案
1)全局變量:一個(gè)全局變量使得一個(gè)對(duì)象可以被訪問,但它不能防止你實(shí)例化多個(gè)對(duì)象。因?yàn)槟愕娜魏未a都能修改全局變量,這將不可避免的引起更多調(diào)試的意外。換句話說,全局變量的狀態(tài)總是會(huì)出現(xiàn)一些問題的。
2)類構(gòu)造函數(shù)私有和類自身的靜態(tài)方法:讓類自身負(fù)責(zé)保存它的唯一實(shí)例(靜態(tài)變量)。這個(gè)類可以保證沒有其他實(shí)例可以被創(chuàng)建(通過截取創(chuàng)建新對(duì)象的請(qǐng)求) ,并且它可以提供一個(gè)訪問該實(shí)例的方法(靜態(tài)方法)。這就是Singleton模式。(dubbo check 線程安全問題等)
單件模式可以多個(gè)實(shí)例
單件模式并不是說一個(gè)類只能只有一個(gè)實(shí)例。假設(shè)我們使用在一個(gè)web 請(qǐng)求或者進(jìn)程里面。一個(gè)用戶id對(duì)應(yīng)的某個(gè)類只能有唯一的實(shí)例。我們的User類,可以有多個(gè)實(shí)例,每個(gè)實(shí)例對(duì)應(yīng)一個(gè)uid. 實(shí)例列表注冊(cè)到map中以u(píng)id為key關(guān)聯(lián)起來。
原型模式
創(chuàng)建型模式一般是用來創(chuàng)建一個(gè)新的對(duì)象,然后我們使用這個(gè)對(duì)象完成一些對(duì)象的操作,我們通過原型模式可以快速的創(chuàng)建一個(gè)對(duì)象而不需要提供專門的new()操作就可以快速完成對(duì)象的創(chuàng)建,這無疑是一種非常有效的方式,快速的創(chuàng)建一個(gè)新的對(duì)象。
例子1:
孫悟空拔下一嘬猴毛,輕輕一吹就會(huì)變出好多的孫悟空來。
例子2:
下面是一個(gè)郵寄快遞的場(chǎng)景:
“給我寄個(gè)快遞?!鳖櫩驼f。
“寄往什么地方?寄給……?”你問。
“和上次差不多一樣,只是郵寄給另外一個(gè)地址,這里是郵寄地址……”顧客一邊說一邊把寫有郵寄地址的紙條給你。
“好!”你愉快地答應(yīng),因?yàn)槟惚4媪擞脩舻囊郧班]寄信息,只要復(fù)制這些數(shù)據(jù),然后通過簡(jiǎn)單的修改就可以快速地創(chuàng)建新的快遞數(shù)據(jù)了。
通過復(fù)制(克隆、拷貝)一個(gè)指定類型的對(duì)象來創(chuàng)建更多同類型的對(duì)象。這個(gè)指定的對(duì)象可被稱為“原型”對(duì)象,也就是通過復(fù)制原型對(duì)象來得到更多同類型的對(duì)象。即原型設(shè)計(jì)模式。在php的很多模板庫(kù),都用到clone。如smarty等。