工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法使一个类的实例化延迟到其子类。
简单工厂模式与工厂方法模式的优缺点:
简单工厂模式
的最大优点在于工厂类包含了必要的逻辑判断,根据客户端提供的参数选择实例化的类,减少了客户端对于具体类的依赖。缺点是每添加个功能都需要去修改工厂类,这样不符合面向对象设计的开放-封闭原则。参考简单工厂
工厂方法模式
继承了简单工厂模式的优点,克服了他的缺点,它本身的缺点是每多加一个产品,需要增加一个产品工厂类,增加了额外的开发量。
下面介绍下工厂方法模式的实现(简单工厂参考链接:简单工厂):
定义一个工厂接口:
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