單例模式確保程式執行過程中乙個特定的類只有乙個例項物件,並提供對這個物件的外部訪問
常見的單例模式應用如執行緒池、快取、日誌物件等
特點:單例類必須自己建立自己的唯一例項,並且給其它物件提供這乙個例項
應用場景:
1.工具類
2.需要重複建立/銷毀的資源消耗過大的類
3.等等
餓漢式單例:程式一啟動就建立物件例項,占用記憶體資源,提高程式效率(典型的以空間換時間)
懶漢式單例:程式一啟動不建立物件例項,什麼時候用到物件例項什麼時候建立,節省資源
//餓漢式——避免的執行緒同步問題,但是如果沒有呼叫就會占用資源,沒有達到懶載入的效果
public
class
singleton
*/public
static singleton getinstance()
}
//懶漢式——達到了懶載入的效果,但是需要解決執行緒同步問題
public
class
singleton}}
return single;
}}
//使用靜態內部類的方式獲取單例
//利用了類載入機制來保證例項化時只有乙個執行緒
//靜態內部類方式在singleton類被裝載時並不會立即例項化
//而是在呼叫getsingleton()方法時例項化,達到了懶載入的效果
public
class
singleton
public
static singleton getsingleton()
}
__new__方法實現的單例
__new__例項化方法
__init__初始化方法
類()例項化時,會先去自身的new方法,沒有就去object的new方法來建立物件,再返回給self
此時self是不存在的,所以用cls表示這個類,用cls來例項化物件,再賦值給self
然後執行init方法給self初始化(給物件設定屬性)
class
singleton
(object):
__instance =
none
def__init__
(self,name,age)
: self.name = name
self.age = age
def__new__
(cls,
*args,
**kwargs):if
not cls.__instance:
cls.__instance =
object
.__new__(cls)
return cls.__instance
''' new方法的方式二:利用反射完成單例
def __new__(cls,*args,**kwargs):
if not hasattr(cls,'__instance'): # 如果當前類中沒有__instance全域性變數就建立乙個,變數的值為當前類的例項
cls.__instance= super(singleton,cls).__new__(cls)
# 等價於 cls.__instance = object.__new__(cls)
return cls.__instance # 返回這個變數
'''s1 = singleton(
'張三'
,'23'
)print(id
(s1)
)#32079112
s2 = singleton(
'李四'
,'24'
)print(id
(s2)
)#32079112
'''當singleton('張三','23')物件例項化時,呼叫__new__方法進行物件的例項化,
類中的變數__instance 為空,所以去建立物件例項用於賦值,然後返回這個例項物件
然後呼叫__init__為屬性賦值
當singleton('李四','24')物件例項化時,呼叫__new__方法進行物件的例項化,
類中的變數__instance為全域性變數,所以物件共享,此時__instance有值,不走if體中的語句,直接返回__instance的值(上乙個例項化物件)
然後呼叫__init__為屬性賦值(覆蓋掉上乙個物件的屬性賦值)
'''
使用裝飾器的單例
def
singleton
(cls)
: __instance =
def_singleton
(*args,
**kargs)
:if cls not
in __instance:
__instance[cls]
= cls(
*args,
**kargs)
return __instance[cls]
return _singleton
@singleton
class
student
(object):
def__init__
(self, name)
: self.name = name
a1 = student(
'zs'
)print(id
(a1)
)#40288520
a2 = student(
'ls'
)print(id
(a1)
)#40288520
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...