設計模式第二講(工廠模式)

  • 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類時,我也可以傳遞參數,提供高了程式碼擴展性。

使用場景

  1. 數據存儲。就拿我們上面實例程式碼一樣,我們需要將數據存儲在不同的存儲系統中時。
  2. 數據快取。現在開發項目,會大量使用框架,框架在做快取時,我們可以自行設置快取驅動,也可以動態設置快取渠道。

總結

工廠模式主要的優點在於降低了程式碼的耦合度,提高了程式碼的擴展性。