單例模式
1請手寫一個單例
#encoding=utf8
import threading
import time
#這里使用方法__new__來實現單例模式
class Singleton(object):#抽象單例
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
#總線
class Bus(Singleton):
lock = threading.RLock()
def sendData(self,data):
self.lock.acquire()
time.sleep(3)
print "Sending Signal Data...",data
self.lock.release()
#線程對象,為更加說明單例的含義,這里將Bus對象實例化寫在了run里
class VisitEntity(threading.Thread):
my_bus=""
name=""
def getName(self):
return self.name
def setName(self, name):
self.name=name
def run(self):
self.my_bus=Bus()
self.my_bus.sendData(self.name)
if __name__=="__main__":
for i in range(3):
print "Entity %d begin to run..."%i
my_entity=VisitEntity()
my_entity.setName("Entity_"+str(i))
my_entity.start()
2單例模式的優點和應用?
單例模式的優點:
1、由於單例模式要求在全局內只有一個實例,因而可以節省比較多的內存空間;
2、全局只有一個接入點,可以更好地進行數據同步控制,避免多重占用;
3、單例可長駐內存,減少系統開銷。
單例模式的應用舉例:
1、生成全局惟一的序列號;
2、訪問全局復用的惟一資源,如磁盤、總線等;
3、單個對象占用的資源過多,如數據庫等;
4、系統全局統一管理,如Windows下的Task Manager;
5、網站計數器。
6、數據庫配置,數據庫連接池
7、應用程序的日志應用
3單例模式的缺點
1、單例模式的擴展是比較困難的;
2、賦於了單例以太多的職責,某種程度上違反單一職責原則(六大原則后面會講到);
3、單例模式是並發協作軟件模塊中需要最先完成的,因而其不利於測試;
4、單例模式在某種情況下會導致“資源瓶頸”。