import settings
class
mysql
: __instance =
none
# 原始狀態設為none
def__init__
(self, ip, port)
: self.ip = ip
self.port = port
@classmethod
deffrom_conf
(cls)
:if cls.__instance is
none
:#如果是第一次例項化,則儲存例項化物件
cls.__instance = cls(settings.ip, settings.port)
return cls.__instance # 如果不是,則直接返回已儲存的例項化物件
obj1 = mysql.from_conf(
)obj2 = mysql.from_conf(
)obj3 = mysql.from_conf(
)# obj4=mysql('1.1.1.3',3302)
print
(obj1)
print
(obj2)
print
(obj3)
# print(obj4)
import settings
defsingleton
(cls)
: _instance = cls(settings.ip, settings.port)
# 在作用域例項化物件,準備被呼叫
def(
*args,
**kwargs):if
len(args)!=0
orlen
(kwargs)!=0
:# 如果傳入值,則重新例項化
obj = cls(
*args,
**kwargs)
return obj
return _instance # 如果不傳值,則直接返回作用域內的例項化物件
class
mysql
:def
__init__
(self, ip, port)
: self.ip = ip
self.port = port
# print(obj.__dict__)
obj1 = mysql(
)obj2 = mysql(
)obj3 = mysql(
)obj4 = mysql(
'1.1.1.3'
,3302
)print
(obj1)
print
(obj2)
print
(obj3)
print
(obj4)
import settings
class
mymeta
(type):
def__init__
(self, class_name, class_bases, class_dic)
:# self=mysql這個類
self.__instance = self(settings.ip, settings.port)
def__call__
(self,
*args,
**kwargs)
:# 呼叫類時觸發
# self=mysql這個類
iflen
(args)!=0
orlen
(kwargs)!=0
:# 如果傳值,則新例項化物件
obj = self.__new__(self)
self.__init__(obj,
*args,
**kwargs)
return obj
else
:return self.__instance # 如果沒有傳值,則使用元類中例項化好的物件
class
mysql
(metaclass=mymeta)
:# mysql=mymeta(...)
def__init__
(self, ip, port)
: self.ip = ip
self.port = port
obj1 = mysql(
)obj2 = mysql(
)obj3 = mysql(
)obj4 = mysql(
'1.1.1.3'
,3302
)print
(obj1)
print
(obj2)
print
(obj3)
print
(obj4)
模組中定義好的類與物件:import settings
class
mysql
:print
('run....'
)def
__init__
(self, ip, port)
: self.ip = ip
self.port = port
instance = mysql(settings.ip, settings.port)
分別匯入:deff1(
):from singleton import instance
print
(instance)
deff2()
:from singleton import instance, mysql
print
(instance)
obj = mysql(
'1.1.1.3'
,3302
)print
(obj)
f1()
f2()
前四種單例模式都提供了生成新物件的介面,這種單例模式只會使用乙個物件,不會再生成新物件
這種單例模式較為安全,反覆生成的物件是同乙個
class
mysql
:# __instance = none 也可以使用這種方法
def__new__
(cls,
*args,
**kwargs):if
nothasattr
(cls,
'instance'):
cls.instance =
super()
.__new__(cls)
# 例項化過程丟在單例處理裡面,保證了單例的唯一性
cls.instance.ip =
'127.0.0.1'
return cls.instance
# if cls.__instance == none:
# cls.__instance = super().__new__(cls)
# return cls.__instance
# 單例內部物件屬性的例項化操作一般不再交給init方法完成
def__init__
(self)
:pass
m1 = mysql(
)print
(m1.ip)
m2 = mysql(
)print
(m2.ip)
m3 = mysql(
)m3.ip =
'192.168.0.1'
print
(a3.ip)
print
(a2.ip)
print
(a1.ip)
m4 = mysql(
)print
(a4.ip)
print
(a3.ip)
print
(a2.ip)
print
(a1.ip)
五種單例模式
1 餓漢模式 public class ehansingleton 提供獲取單例物件的方法 public static ehansingleton getinstance 2 懶漢式 懶漢式 public class lanhansingleton 提供獲取單例物件的方法 增加 synchroniz...
五種單例模式實現
public class hunger private final static hunger hunger newhunger public static hunger getinstance 多個執行緒安全,但無法進行懶載入,如果類成員很多,則占用的資源比較多 public class lazy...
五種基本單例模式
注意 1 單例類只能在乙個jvm例項中有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。接下來我們介紹一下我們常見到的幾種單例模式 正如其名 餓漢 類載入的時候就例項化,並且建立單例物件。優點 先天性執行緒安全 當類初始化的時候 該物件就會被建立 缺點 如果...