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

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

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

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

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

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

def connect(db, *arg, **kwargs): n db = db.lower()n dbname = kwargs[db]nn if db == mysql:n result = "mysql://{username}:{password}@{server}/{dbname}".format(username = kwargs[username], password = kwargs[password], server = kwargs[server], dbname=dbname)n elif db == sqlite:n result = sqlite:///{server}{dbname}.sqlite.format(server = kwargs[server], dbname=dbname)nn return resultn

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

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

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

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

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

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

推薦閱讀:

Python黑帽編程 3.3 MAC洪水攻擊
python anaconda 怎麼安裝?
對ldap實現增刪改查--附demo
python 函數中傳值,傳的是引用還是複製一份傳給另一個函數,會修改調用函數裡面的值嘛?

TAG:Python | 设计模式 |