PHP五種常用的設計模式——工廠模式

一直對設計模式有一種敬畏之心,每次想要看設計模式的時候就會想到Erich GammaRichard HelmRalph JohnsonJohn Vlissides的黑皮《設計模式》,基本都望而止步,要把那本書看完可不是一時半會的,而且在沒有項目經驗的情況下,個人感覺基本都是紙上談兵。

今天在IBM Developerworks上看到一篇文章將PHP中常用的五種設計模式,感覺還不錯,而且只有五種五種五種(重要的強調三遍)!先從簡單的入手,把這五種消滅了再說。以後慢慢學習其他的設計模式。

工廠模式(Factory Pattern

工廠這個詞的使用是非常形象,字面意思可以這樣認爲,這種模式下,我們有一個工廠,這個工廠生產很多一種或者幾種產品(其實多種的情況是覆蓋了一種的),但是每個產品怎麼生產和包裝的我們不知道,其實我們也不需要知道,知道的越多你就越迷糊,以後你的行爲就受制於太多雜事,也就是我們常說的耦合度太高,因此我們就將所有的事情交給工廠負責,我們只用告訴工廠需要什麼,工廠把產品交付給你就是了。一旦產品的工藝發生改變,工廠負責就好,你使用該產品的工藝不受影響。因此工廠模式可以大大的降低系統的耦合度,增強系統的穩定性,當然也會提高代碼的複用率。

在實際的程序設計中,工廠相當於一個對外的接口,那麼這個接口的返回類型是確定的,那麼我們怎麼通過這個工廠來生產不同的產品發回給客戶呢?很簡單,做一個所有產品的“模子”就可以,這個“模子”有每個產品的所有特徵,但是不能用,需要具體的產品實現這些特性,就是我們常說的Interface
使用類圖表示如下:

PHP的實現
  • 編寫一個接口 Product.php
<?php
/**
* Created by PhpStorm.
* User: Defei
* Date: 2015/8/8
* Time: 16:14
*/

interface Product{
    public function getName();
}
  • 設計一個產品A實現Product接口
<?php
/**
* Created by PhpStorm.
* User: Defei
* Date: 2015/8/8
* Time: 16:16
*/

class ProductA implements Product{

    public function getName(){
        // TODO: Implement getName() method.
        echo '我是產品A';
    }
}
  • 設計產品B實現Product接口
<?php
/**
* Created by PhpStorm.
* User: Defei
* Date: 2015/8/8
* Time: 16:17
*/

class ProductB implements Product{

    public function getName(){
        // TODO: Implement getName() method.
        echo '我是產品B';
    }

}
  • 建造一座工廠生產產品AB
<?php
/**
* Created by PhpStorm.
* User: Defei
* Date: 2015/8/8
* Time: 16:18
*/
class ProductFactory{

    /**
     * @param $product_name
     * @return mixed
     */
    public function factory($product_name){
        return new $product_name; //PHP可以使用名字直接new一個同名的對象這個很方便
    }

}
測試

產品AB已經設計好了,工廠也建好了,下一步就是測試一下這個工廠對的生產能力如何。

<?php
/**
* Created by PhpStorm.
* User: Defei
* Date: 2015/8/8
* Time: 16:20
*/
include 'ProductFactory.php';
include 'Product.php';
include 'ProductA.php';
include 'ProductB.php';

$factory = new  ProductFactory();
echo $factory->factory('ProductA')->getName().PHP_EOL;
echo $factory->factory('ProductB')->getName();

輸出結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章