文章出處

示例代碼詳見https://github.com/52fhy/design_patterns

工廠方法

工廠方法是針對每一種產品提供一個工廠類。通過不同的工廠實例來創建不同的產品實例。

相比簡單工廠,創建對象這件事不再交由一個類來創建:把簡單工廠拆分,每個產品由專門的一個簡單工廠來實現,每個簡單工廠實現工廠接口類。這樣實現在同一等級結構中,支持增加任意產品。

工廠方法UML圖:

簡單工廠需要有4個角色:

  • Product接口類:用于定義產品規范;
  • 具體的產品實現,例如ConcreateProductA、ConcreateProductB;
  • 抽象工廠類IFactory:用于規范工廠;
  • 具體產品創建的簡單工廠,例如ConcreateFactoryA、ConcreateFactoryB。

代碼:
ICar.php:定義產品規范:

namespace Yjc\SimpleFactory;

interface ICar
{
    public function driver();
}

具體產品實現:

namespace Yjc\SimpleFactory;

class Benz implements ICar
{
    public function driver()
    {
        echo 'benz driver.';
    }
}

class Bmw implements ICar
{
    public function driver()
    {
        echo 'bmw driver.';
    }
}

抽象工廠類IFactory:

namespace Yjc\Factory;

interface IFactory
{
    public static function makeCar();
}

具體工廠實現:

namespace Yjc\Factory;

class FactoryBenz implements IFactory
{
    public static function makeCar()
    {
        return new Benz();
    }
}

class FactoryBmw implements IFactory
{
    public static function makeCar()
    {
        return new Bmw();
    }
}

測試:

$car = Factory\FactoryBenz::makeCar();
$car->driver();

思考:如果不使用工廠模式來實現我們的例子,也許代碼會減少很多——只需要實現已有的車,不使用多態。但是在可維護性上,可擴展性上是非常差的(你可以想象一下添加一輛車后要牽動的類)。因此為了提高擴展性和維護性,多寫些代碼是值得的,尤其是復雜項目里。

參考:
1、設計模式:簡單工廠、工廠方法、抽象工廠之小結與區別 - superbeck的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/superbeck/article/details/4446177
2、簡單工廠、工廠方法、抽象工廠、策略模式、策略與工廠的區別 - Danny Chen - 博客園
http://www.cnblogs.com/zhangchenliang/p/3700820.html


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()