單例的三種實現方式

2021-08-20 02:44:43 字數 2157 閱讀 1601

方式一:類方法實現單例模式

class

mysql:

__instance = none

def__init__

(self,host,port):

self.host = host

self.port = port q

@classmethod

defsingleton

(cls):

ifnot cls.__instance:

cls.__instance = cls(setting.host,setting.port)

return cls.__instance

obj1 = mysql.singleton()

obj2 = mysql.singleton()

print(obj1)

print(obj2)

第二種:自定製元類方法實現單例

import setting

class

mymeta

(type):

def__init__

(self,class_name,base,dic):

super().__init__(class_name, base, dic)#初始化乙個類(mysql)

self.__instance = object.__new__(self)#利用mysql類的基類__new__方法造出乙個mysql類的物件

self.__init__(self.__instance,setting.host,setting.port)#呼叫類的__init__方法例項化出這個物件

def__call__

(self, *args, **kwargs):

#如果對元類的例項化物件mysql類加括號呼叫則自動觸發,元類的物件類mysql會作為第乙個引數自動傳入

#相當於mysql.__call__()

if args or kwargs:

obj = object.__new__(self)

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

return obj

return self.__instance

class

mysql

(metaclass=mymeta):

#定義類mysql(實際就是(呼叫元類的_init__方法))

def__init__

(self,host,port):

self.host = host

self.port = port

obj1 = mysql()#加括號呼叫,例項化生成物件(呼叫類的__init__方法)

obj2 = mysql()

print(obj1)

print(obj2)

obj3 = mysql("129.0.0.1",8080)

obj4 = mysql("129.0.0.1",8080)

print(obj3)

print(obj4)

第三種:自定製元類方法實現單例
def

sigleton

(cls)

:__instance = cls(setting.host,setting.port)

def(*args,**kwargs)

:if args or

kwargs:

# obj = cls(*args, **kwargs)

mysql:

def__init__

(self,host,port)

:self.host = host

self.port = port

port = 8888

host = "127.0.0.1"

實現單例的三種方式

1 必須在該類中 自己先建立出乙個物件並私有化物件.2 私有化自身的構造器 防止外界通過構造器建立新的物件 3 想外暴露乙個公共的靜態方法用於獲取自身的物件 目的 保證某乙個在整個應用中某乙個類有且只有乙個例項 乙個類在堆記憶體只存在乙個物件 即所有指向該型別例項的引用都指向同一塊記憶體空間。cla...

單例模式的三種實現方式

1.餓漢模式 package com.fullstacker.study.designpattern.singleton 餓漢模式 餓漢模式是執行緒安全的單例模式 author xingguishuai create 2017 03 27 15 53 public class hungrysingl...

單例模式的三種實現方式

所謂 餓漢式 是指單例項在類載入時刻就已構造完成。public class singleton1 類載入的初始化階段,會給靜態變數instance賦值,此時單例項得到構建 private static singleton1 instance newsingleton1 public static s...