工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法使一个类的实例化延迟到其子类。

简单工厂模式与工厂方法模式的优缺点:

简单工厂模式的最大优点在于工厂类包含了必要的逻辑判断,根据客户端提供的参数选择实例化的类,减少了客户端对于具体类的依赖。缺点是每添加个功能都需要去修改工厂类,这样不符合面向对象设计的开放-封闭原则。参考简单工厂

工厂方法模式继承了简单工厂模式的优点,克服了他的缺点,它本身的缺点是每多加一个产品,需要增加一个产品工厂类,增加了额外的开发量。

下面介绍下工厂方法模式的实现(简单工厂参考链接:简单工厂):

定义一个工厂接口:

interface IFactory {

		public function createOperation();
}

产品功能实现工厂接口:

class AddFactory implements IFactory {

		public function createOperation()
		{
    return new AddOperator();
		}
}

class SubFactory implements IFactory {

public function createOperation()
{
    return new SubOperator();
}

}

class MulFactory implements IFactory {

public function createOperation()
{
    return new MulOperator();
}
}

运算类:

class BaseOperator{

protected $numB;
protected $numA;

public function _set($name,$value) {
    $this->$name = $value;
}

public function _get($name) {
    return $this->$name;
}

public function getResult()
{
    return 0;
}
}

class AddOperator extends BaseOperator {

public function getResult()
{
    return $this->numA + $this->numB;
}
}

class SubOperator extends BaseOperator {

public function getResult()
{
    return $this->numA - $this->numB;
}
}


class MulOperator extends BaseOperator {

public function getResult()
{
    return $this->numA / $this->numB;
}
}

客户端代码:

$opera = '+';
switch ($opera) {
 case '+':
     $factory = new AddFactory();
     break;
 case '-':
     $factory = new SubFactory();
     break;
case '*':
     $factory = new MulFactory();
     break;
default:
     # code...
     break;
 }

 $opertor = $factory->createOperation();

 $numA = 10;
 $numB = 4;
 $opertor->_set('numA',10);
 $opertor->_set('numB',4);
 $result = $opertor->getResult(); 

 echo '结果是:'.$result;

结果:

结果是:14