通俗 Python 設計模式——工廠模式

平田發表於2016-11-18

今天講一下最簡單常用的建立型模式——工廠模式

工廠模式,從名字上來講就已經說明了它的本質——像工廠一樣,根據得到的材料構造需要的產品。但是根據書上的介紹工廠模式通常有兩種形式:一種工廠方法,一種是抽象工廠。我們分別來講述一下工廠模式的這兩種形式。

通俗的解釋工廠方法就是是:給出固定的介面,根據你的輸入,會得到與輸入相對應的輸出。也許這個說法還是不夠通俗,那麼我們來看一個例子。

在編寫一個web框架時,我們需要考慮到使用者可能會連線各種各樣的資料庫,但是我們不能預知使用者會使用哪個資料庫。於是我們提供一個通用方法,裡面包含了各個資料庫的連線方案,使用者在使用過程中,只需要傳入資料庫的名字並給出連線所需要的資訊,即可得到一個固定的 | 針對使用者所選資料庫的 | 連線字串。

如果還是不明白,那我們來看看程式碼好了:

def connect(db, *arg, **kwargs):
db = db.lower()
dbname = kwargs['db']

if db == 'mysql':
    result = "mysql://{username}:{password}@{server}/{dbname}".format(username = kwargs['username'], password = kwargs['password'], server = kwargs['server'], dbname=dbname)
elif db == 'sqlite':
    result = 'sqlite:///{server}{dbname}.sqlite'.format(server = kwargs['server'], dbname=dbname)

return result

如果使用者的輸入為 'MySQL', 那麼工廠方法會為其返回一個用於連線 MySQL 資料庫的連線字串;如果使用者的輸入為 'SQLite',那麼將會得到一個用於連線 SQLite 資料庫的連線字串;更多的則是同樣的原理。

所以現在大家看到了,其實這個方法非常初級非常暴力,就是無限的羅列需要考慮的情況並給出對應的處理而已。

現在我們來講講抽象工廠。故名思議,它表示針對工廠方法進一步抽象化,用於工廠方法本身也需要抽象集中管理的情況。比如說書上的這個例子:

你在編寫一款面向全年齡的遊戲,遊戲本身需要使用工廠方法進行開發。但遊戲也需要考慮不同年齡段玩家的需求和口味不同,所以需要為不同年齡段的玩家針對遊戲進行一定的修改。於是在使用者輸入年齡後,執行符合其年齡的要求的遊戲。

這種情況下,我們建立遊戲內容的過程,可以使用工廠方法統一管理,但是針對建立符合哪個年齡段的遊戲內容,我們則需要進一步抽象出來管理,這種情況就是所謂的抽象工廠

不過Python中的抽象工廠與其他靜態語言的抽象工廠有一個小小的區別。得益於Python的靈活性,其型別實在執行中確定,即避免了其他靜態語言中必須要建立抽象類或介面的複雜動作。具體程式碼較長,這裡就不貼了,有興趣的朋友可以直接閱讀原書程式碼部分。

相關文章