(一)Python入門-6面向對象編程:12設計模式之工廠模式-單例模式

一:工廠模式實現

  設計模式是面嚮對象語言特有的內容,是咱們在面臨某一類問題時候固定的作法,設計 模式有不少種,比較流行的是: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>

相關文章
相關標籤/搜索