設計模式 單例模式

2021-10-03 21:39:38 字數 2899 閱讀 3180

單例模式確保程式執行過程中乙個特定的類只有乙個例項物件,並提供對這個物件的外部訪問

常見的單例模式應用如執行緒池、快取、日誌物件等

特點:單例類必須自己建立自己的唯一例項,並且給其它物件提供這乙個例項

應用場景:

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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...