單例概念:
????單例是一個特殊的類,這個類只能創(chuàng)建一次實例,例子如下:
? ? ? ? ? ? 1.a = Std(name='leo'), b = Std(name='jack'),兩者的指向都是name=‘leo’的對象;
? ? ? ? ? ? 2.windows中只有一個回收站,打開一次回收站只會出現(xiàn)一次窗口,雙擊第二次不會出現(xiàn)第二個窗口 ,這就是單例,對象不會重新創(chuàng)建,只會創(chuàng)建一次;
單例的作用:
? ? ? ? 1.用于有單例需求的業(yè)務場景,例如windows的回收站;
? ? ? ? 2.之前我做的項目用到了第三方sdk做接口發(fā)送短信驗證碼,但是該sdk寫的代碼不夠好,重復創(chuàng)建對象去發(fā)送短信,如果有幾十萬個用戶同時有發(fā)送短信的需求,那么該sdk就要重復創(chuàng)建幾十萬個用于發(fā)送短信驗證碼的對象,實際上它只是要調用對象的方法進行發(fā)送短信罷了,因此可以用單例設計模式減輕服務器負擔,代碼對比如下:
第三方sdk源碼:
[python]?view plain?copy
#初始化REST?SDK??
rest?=?REST(serverIP,serverPort,softVersion)??
rest.setAccount(accountSid,accountToken)??
rest.setAppId(appId)??
result?=?rest.sendTemplateSMS(to,datas,tempId)??
我寫的單例代碼:
[python]?view plain?copy
class?CCP(object):??
"""封裝單例類,用于統(tǒng)一的發(fā)送短信驗證碼"""??
_singleton?=None??
def?__new__(cls,?*args,?**kwargs):??
if?not?cls._singleton:??
cls._instance?=?super(CCP,?cls).__new__(cls,?*args,?**kwargs)??
cls._instance.rest?=?REST(serverIP,serverPort,softVersion)??
cls._instance.rest.setAccount(accountSid,accountToken)??
cls._instance.rest.setAppId(appId)??
return?cls._instance??
def?send_sms_msg(self,?to,?datas,?tempId):??
"""發(fā)送短信驗證碼的實例方法"""??
ret?=self.rest.sendTemplateSMS(to,?datas,?tempId)??
if?ret.get('statusCode')?==?'000000':??
return?1??
else:??
return?0??
總結:單例設計模式用于有減少重復創(chuàng)建實例需求的場景,例如windows的回收站頁面,短信發(fā)送對象等業(yè)務場景;