設計模式和 Singleton 模式簡介

設計模式為軟體設計中的 commonly occurring problems 提供瞭解決方案。設計模式首先由 GoF(Gang of Four) 引入,他們將常見模式描述為一遍又一遍地出現的問題以及這些問題的解決方案。

設計模式有四個基本要素:

  1. The pattern name 是一個我們可以用來描述設計問題,它的解決方案和一兩個字的後果的控制代碼。
  2. The problem 描述了何時應用模式。
  3. The solution 描述了構成設計的元素,它們之間的關係,責任和協作。
  4. The consequences 是應用模式的結果和權衡。

設計模式的優點:

  1. 它們可以在多個專案中重複使用。
  2. 問題的架構層面可以解決
  3. 它們經過時間考驗並經過充分驗證,這是開發人員和架構師的經驗
  4. 他們有可靠性和依賴性

設計模式可分為三類:

  1. 創作模式
  2. 結構模式
  3. 行為模式

Creational Pattern - 他們關心的是如何建立物件並且它們隔離了物件建立的細節。

Structural Pattern - 他們設計類和物件的結構,以便他們可以組合以獲得更大的結果。

Behavioral Pattern - 他們關注物體之間的相互作用和物體的責任。

單例模式

它是一種 creational pattern,它提供了一種機制,只有一個和一個給定型別的物件,並提供一個全域性訪問點。

例如,Singleton 可用於資料庫操作,我們希望資料庫物件保持資料一致性。

履行

我們可以通過僅建立一個 Singleton 類的例項並再次提供相同的物件來在 Python 中實現 Singleton Pattern。

class Singleton(object):
    def __new__(cls):
        # hasattr method checks if the class object an instance property or not.
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance

s = Singleton()
print ("Object created", s)

s1 = Singleton()
print ("Object2 created", s1)

輸出:

('Object created', <__main__.Singleton object at 0x10a7cc310>)
('Object2 created', <__main__.Singleton object at 0x10a7cc310>)

請注意,在 C++或 Java 等語言中,此模式是通過使建構函式為私有並建立執行物件初始化的靜態方法來實現的。這樣,在第一次呼叫時建立一個物件,然後類返回相同的物件。但在 Python 中,我們沒有任何方法可以建立私有建構函式。

工廠模式

工廠模式也是一個 Creational patternfactory 一詞意味著一個類負責建立其他型別的物件。有一個類充當工廠,其中包含與之關聯的物件和方法。客戶端通過使用某些引數呼叫方法來建立物件,並且工廠建立所需型別的物件並將其返回給客戶端。

from abc import ABCMeta, abstractmethod

class Music():
    __metaclass__ = ABCMeta
    @abstractmethod
    def do_play(self):
        pass

class Mp3(Music):
    def do_play(self):
        print ("Playing .mp3 music!")
    
class Ogg(Music):
    def do_play(self):
        print ("Playing .ogg music!")
    
class MusicFactory(object):
    def play_sound(self, object_type):
        return eval(object_type)().do_play()
    
if __name__ == "__main__":
    mf = MusicFactory()
    music = input("Which music you want to play Mp3 or Ogg")
    mf.play_sound(music)

輸出:

Which music you want to play Mp3 or Ogg"Ogg"
Playing .ogg music!

MusicFactory 是這裡的工廠類,它根據使用者提供的選擇建立 Mp3Ogg 型別的物件。