設計模式是面嚮對象語言特有的內容,是咱們在面臨某一類問題時候固定的作法,設計 模式有不少種,比較流行的是:GOF(Goup Of Four)23 種設計模式。設計模式
工廠模式實現了建立者和調用者的分離,使用專門的工廠類將選擇實現類、建立對象進 行統一的管理和控制。測試
【操做】spa
#工廠模式實現 class CarFactory: def creatCar(self,brand): if brand == '奔馳': return Benz() elif brand == '寶馬': return BMW() elif brand == '比亞迪': return BYD() else: return '位置品牌,沒法建立' class Benz: pass class BMW: pass class BYD: pass factory = CarFactory() c1 = factory.creatCar('奔馳') c2 = factory.creatCar('寶馬') print(c1) print(c2)
運行結果:設計
<__main__.Benz object at 0x000001DF7C4B8FD0>
<__main__.BMW object at 0x000001DF7C4E0048>code
單例模式(Singleton Pattern)的核心做用是確保一個類只有一個實例,而且提供一 個訪問該實例的全局訪問點。對象
單例模式只生成一個實例對象,減小了對系統資源的開銷。當一個對象的產生須要比較 多的資源,如讀取配置文件、產生其餘依賴對象時,能夠產生一個「單例對象」,而後永久 駐留內存中,從而極大的下降開銷。blog
單例模式有多種實現的方式,咱們這裏推薦重寫__new__()的方法。內存
【操做】資源
#單例模式實現 class MySingleton: __obj = None #用於判斷對象是否已經建立,保證只建立一個對象 __init_flag = True #用於判斷是否已進行初始化,保證只初始化一次 def __new__(cls, *args, **kwargs): if cls.__obj == None: #判斷是否已建立對象,爲None說明沒有對象,進行建立,不然對象已有再也不建立 cls.__obj = object.__new__(cls) return cls.__obj def __init__(self,name): if MySingleton.__init_flag: #判斷是否初始化,True未初始化,進行初始化操做 print('init...') self.name = name MySingleton.__init_flag = False #初始化標記設爲False,保證只初始化一次 a = MySingleton('aa') print(a) b = MySingleton('bb') print(b) c = MySingleton('cc') print(c)
運行結果:(a,b,c爲同一個對象)it
init...
<__main__.MySingleton object at 0x000001E43BFF8400>
<__main__.MySingleton object at 0x000001E43BFF8400>
<__main__.MySingleton object at 0x000001E43BFF8400>
設計模式稱之爲「模式」,就是一些固定套路。咱們很容易用到其餘場景上,好比工廠模式,咱們若是將工廠類定義成「單例」,只須要簡單的套用便可實現:
【操做】
#測試工廠模式和單例模式的整合使用 class CarFactory: __obj = None __init_flag = True def creatCar(self,brand): if brand == '奔馳': return Benz() elif brand == '寶馬': return BMW() elif brand == '比亞迪': return BYD() else: return '位置品牌,沒法建立' def __new__(cls, *args, **kwargs): if cls.__obj == None: cls.__obj = object.__new__(cls) return cls.__obj def __init__(self): if CarFactory.__init_flag: print('init CarFactory...') CarFactory.__init_flag = False class Benz: pass class BMW: pass class BYD: pass factory = CarFactory() c1 = factory.creatCar('奔馳') c2 = factory.creatCar('寶馬') print(c1) print(c2) factory2 = CarFactory() print(factory,factory2)
運行結果:
init CarFactory... <__main__.Benz object at 0x0000017735D200B8> <__main__.BMW object at 0x0000017735D20080> <__main__.CarFactory object at 0x0000017735D20048> <__main__.CarFactory object at 0x0000017735D20048>