設計模式第二講(工廠模式)
- 2019 年 11 月 12 日
- 筆記
需要仔細閱讀文字內容部分
文章導讀
今天分享的是工廠模式.在分享公式模式之前,我們先看下面兩張圖.
圖一
圖二
圖一顯示的是,我們要組裝一個蘋果手機,需要根據我們使用的零件來定,比如晶片在美國,我們就需要跑到美國去拿晶片,需要螢幕,我們可能跑到日本去拿螢幕。然而圖二就不一樣了,不管你組裝一個蘋果手機需要多少零件,我直接找一個工廠,給工廠打聲招呼,我需要什麼零件,工廠按照你的需求提供相應的零件,至於這些零件,工廠如何去獲取,這就不是我們組裝手機所關心的,我們只關心我們需要的東西得到就行了。
將上面的邏輯放在我們程式中就可以這樣理解了。我們創建一個商品類,要將商品存儲起來,是存在Redis呢還是存在MySql中呢?(這裡只是一個舉例).如果我們存在MySQL中,這時候我們直接去new MysQL,然後做插庫操作。通力,另外一個功能模組,比如文章添加,也是同樣的道理,我選擇存儲MySQL中,這時候我們也可以去new MySQL,然後做插庫操作。當系統中存在大量的這種場景,如果沒有特殊的需求,我們都可以這樣實現。
突然有這麼一天,技術leader決定,我們不存MySQL了,我們存Redis中。這時候,我們豈不是得崩潰了,系統中全都是使用new MySQL去存儲的,我一個個換,那不得搞死人,同時也會出現遺留的地方。這時候,就體現了工廠模式的好處來了。就像上面的圖二一樣,我不管你用什麼方式存儲,我商品類,文章類直接去找一個工廠類,調用插入方法就行了。至於你用什麼存儲方式,我直接去工廠模式修改一下就行了。
工廠模式的定義
工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式.[來自百度]
工廠模式是為了解決大量重複程式碼,擴展性低導致程式碼耦合度高的場景的 一種設計模式.[個人理解]
工廠模式的優勢
1.將大量重複的程式碼,封裝在一個類中,減少了程式碼的耦合度。
2.避免程式碼在後期調整中,導致大量的修改,提高了程式碼的擴展性。
程式碼演示
創建介面類
/**定義一個公共的介面,以及增刪改查的介面方法*/interface Opreation{ public function insert(); public function select(); public function update(); public function delete();}
創建Redis和MySQL存儲的操作類,集成介面類的方法
/**Redis 操作類*/class Redis implements Opreation{ public function insert(){ } public function select(){ } public function update(){ } public function delete(){ }} /**MySql 操作類*/class Mysql implements Opreation{ public function insert(){ } public function select(){ } public function update(){ } public function delete(){ }}
創建工程類,去實例化快取類
/**定義工廠類,實例化類*/class Factor{ public $handle = ''; public function __construct($type='mysql'){ $this->handle = new ucwords($type); }}
創建實際的業務處理類
/** 商品管理功能 */class Goods{ // 查詢商品 public function lists () { $model = new Factor(); $model->select(); } // 刪除商品 public function del () { $model = new Factor(); $model->delete()(); }} /** * 文章管理功能 */class Article{ // 添加文章 public function add () { $model = new Factor(); $model->insert(); } // 修改文章 public function edit () { $model = new Factor(); $model->update(); }}
通過上面的實例程式碼,我們不難看出,這樣寫的擴展性,以及程式碼的低耦合度。當我文章類和商品類如果需要存儲Redis時,我直接去Factory類的構造函數修改即可,同時在實例化Factory類時,我也可以傳遞參數,提供高了程式碼擴展性。
使用場景
- 數據存儲。就拿我們上面實例程式碼一樣,我們需要將數據存儲在不同的存儲系統中時。
- 數據快取。現在開發項目,會大量使用框架,框架在做快取時,我們可以自行設置快取驅動,也可以動態設置快取渠道。
總結
工廠模式主要的優點在於降低了程式碼的耦合度,提高了程式碼的擴展性。