五種單例模式

2021-09-25 21:00:22 字數 4030 閱讀 5584

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 單例類必須給所有其他物件提供這一例項。接下來我們介紹一下我們常見到的幾種單例模式 正如其名 餓漢 類載入的時候就例項化,並且建立單例物件。優點 先天性執行緒安全 當類初始化的時候 該物件就會被建立 缺點 如果...