Python與設計模式之單例模式

2022-09-07 06:48:07 字數 3458 閱讀 6684

一、什麼是單例

即單個例項,指的是同乙個類例項化多次的結果指向同乙個物件,用於節省記憶體空間

如果我們從配置檔案中讀取配置來進行例項化,在配置相同的情況下,就沒必要重複產生物件浪費記憶體了

#

settings.py檔案

ip = '

1.1.1.1

'port = 3303

二、四種單例模式的實現方式

#

方式一:定義乙個類方法實現單例模式

import

settings

class

people:

__instance = none #

用於儲存例項化的狀態

def__init__

(self, ip, port):

self.ip =ip

self.port =port

@classmethod

defget(cls):

if cls.__instance

isnone:

cls.

__instance =cls(settings.ip, settings.port)

return cls.__instance

obj1 =people.get()

obj2 =people.get()

print

(obj1)

print

(obj2)

#<__main__.people object at 0x00000000021ba9b0>

#<__main__.people object at 0x00000000021ba9b0>

#方式二:定義乙個裝飾器實現單例模式

import

settings

defsinglet(cls):

_instance = cls(settings.ip, settings.port) #

先例項化乙個物件

if args or

kwargs:

obj = cls(*args, **kwargs)

return obj #

有引數是返回後來例項化物件

return _instance #

無參時,返回已經例項化好的物件

return

@singlet

#class

mysql:

def__init__

(self, ip, port):

self.ip =ip

self.port =port

#沒有引數時,單例模式

obj1 =mysql()

obj2 =mysql()

obj3 =mysql()

obj4 = mysql('

1.1.1.1

', 3303)

print

(obj1)

print

(obj2)

print

(obj3)

print

(obj4)

#<__main__.mysql object at 0x0000000001e6aa90>

#<__main__.mysql object at 0x0000000001e6aa90>

#<__main__.mysql object at 0x0000000001e6aa90>

#<__main__.mysql object at 0x0000000001e6ab00>

#方式三:定製元類實現單例模式

import

settings

class

mymeta(type):

def__init__

(self, class_name, class_bases, class_dic):

instance =self(settings.ip, settings.port)

self.

__instance =instance

def__call__(self, *args, **kwargs): #

self=mysql

if args or kwargs: #

有引數執行下面的**

obj = self.__new__(self) #

創造乙個空物件

self.__init__(obj, *args, **kwargs) #

初始化return obj #

返回物件

return self.__instance

class mysql(metaclass=mymeta):

def__init__

(self, ip, port):

self.ip =ip

self.port =port

obj1 =mysql()

obj2 =mysql()

obj3 =mysql()

obj4 = mysql('

1.2.3.1

', 3305)

print

(obj1)

print

(obj2)

print

(obj3)

print

(obj4)

#<__main__.mysql object at 0x00000000021baa90>

#<__main__.mysql object at 0x00000000021baa90>

#<__main__.mysql object at 0x00000000021baa90>

#<__main__.mysql object at 0x00000000021bab00>

方式四:利用模組匯入實現單例模式

#singleton模組

import

settings

class

mysql:

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('

1111

', 3302)

print

(obj)

f1()

f2()##

#

繼承單例模式 php PHP設計模式之單例模式

單例模式,就是保持乙個物件只存在乙個例項。並且為該唯一例項提供乙個全域性的訪問點 一般是乙個靜態的getinstance方法 單例模式應用場景非常廣泛,例如 資料庫操作物件 日誌寫入物件 全域性配置解析物件 這些場景的共同特徵是從業務邏輯上來看執行期間改物件卻是只有乙個例項 不斷new多個例項會增加...

Headfirst java設計模式 單例模式

單例 件 模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。實現 1.懶漢式 通過延遲例項化實現的單例模式 使用synchronized處理多執行緒訪問,但是效能較差。public class lazyinstantiazesingleton public static synchronized...

Python之單例設計模式

單例是一種設計模式,應用該模式的類只會生成乙個例項。單例模式保證了在程式的不同位置都可以且僅可以取到同乙個物件例項 如果例項不存在,會建立乙個例項 如果已存在就會返回這個例項。因為單例是乙個類,所以你也可以為其提供相應的操作方法,以便於對這個例項進行管理。以下是實現方法索引 使用 new 方法在創造...