文章出處
文章列表
示例代碼詳見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
文章列表
全站熱搜