php设计模式之工厂方法模式

模式定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

模式结构

工厂方法模式包含如下角色:

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

代码示例

<?php

interface IMath
{
   function count($num1, $num2);
}

class Add implements IMath
{
   public function count($num1, $num2)
  {
       return $num1 + $num2;
  }
}

class Sub implements IMath
{
   public function count($num1, $num2)
  {
       return $num1 - $num2;
  }
}

interface IFactory
{
   static function getObj ();
}

class FacAdd implements IFactory
{
   public static function getObj()
  {
       return new Add();
  }
}

class FacSub implements IFactory
{
   public static function getObj()
  {
       return new Sub();
  }
}

$math = FacSub::getObj();
echo $math->count(10, 20);

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。