單例模式的幾種實現方式:
1.使用模組
2.使用__new__
3.使用裝飾器
4.使用元類
使用模組:python的模組就是天然的單例模式,因為模組在第一次匯入的時候,會生成.pyc的檔案,在第二次匯入的時候就會直接載入.pyc檔案,而不會再次執行模組**
使用__new__:
#例項化乙個單例
class
singleton(object):
__instance =none
def__new__
(cls, age, name):
#如果類屬性__instance的值為none,
#那麼就建立乙個物件,並且賦值為這個物件的引用,保證下次呼叫這個方法時
#能夠知道之前已經建立過物件了,這樣就保證了只有1個物件
ifnot cls.__instance
: cls.
__instance = object.__new__
(cls)
return cls.__instance
a = singleton(18, "
dongge")
b = singleton(8, "
dongge")
(id(a))
print(id(b))
使用裝飾器:
from functools importwraps
defsingleton(cls):
instances ={}
@wraps(cls)
def getinstance(*args, **kwargs):
if cls not
ininstances:
instances[cls] = cls(*args, **kwargs)
return
instances
return
getinstance
@singleton
class
bar:
pass
b0 =bar()
b1 =bar()
(id(b0))
(id(b1))
使用元類:
元類(metaclass)可以控制類的建立過程
classsingleton(type):
"""元類繼承type
"""_instance ={}
def__call__(cls, *args, **kwargs):
if cls not
incls._instance:
cls._instance[cls] = super().__call__(*args, **kwargs)
return
cls._instance
class bar(metaclass=singleton):
pass
b0 =bar()
b1 =bar()
(id(b0))
print(id(b1))
工廠模式:
classfruit(object):
def__init__
(self):
pass
defprint_color(self):
pass
class
def__init__
(self):
pass
defprint_color(self):
print("")
class
orange(fruit):
def__init__
(self):
pass
defprint_color(self):
print("
orange is in orange")
class
fruitfactory(object):
fruits =
def__new__
(cls, name):
if name in
cls.fruits.keys():
return
cls.fruits[name]()
else
:
return
fruit()
fruit1 = fruitfactory("")
fruit2 = fruitfactory("
orange
")
單例模式 工廠模式
單例模式 一 什麼是單例模式 有時候我們會遇到這樣一種情況,乙個類只能有乙個物件被例項化,這時我們就可以使用單例模式了。單例模式通過類本身來管理其唯一例項。在設計這個類的時候,讓他只能建立乙個例項並提供對此例項的全域性訪問。因此單例模式有兩個最基本的條件是,確保乙個類只有乙個例項被建立,提供乙個對例...
工廠模式 單例模式
一.單例模式介紹 單例類只能有乙個例項。單例類必須自己建立自己的唯一例項。單例類必須給所有其他物件提供這一例項。二.單例模式分為 4 雙重檢驗 這是最優的執行緒安全 即使用於單執行緒又適用於多執行緒 第乙個進來的時候,判斷為空,然後加鎖,繼續判斷為空,如果開闢了空間之後,還沒有去賦值,這時候有其他執...
單例模式 工廠模式
單例 package com.enorth.user public class singleton public static singleton getinstance return singleton 簡單工廠 產品介面 public inte ce product 具體產品a public c...