应用场景
要实例化的对象充满不确定性可能会改变的时候;
要创建的对象的数目和类型是未知的;
结构
1个 interface 或者 abstract 产品父类;
多个实现 interface 或者继承 abstract 的具体产品类;
1个 interface 或者 abstract 工厂父类;
多个实现 interface 或者继承 abstract 的具体工厂类;
具体工厂类和具体产品类一一对应;
在具体工厂类中实例化具体的产品类
<?php
/**
* 操作类型抽象类
*
* Class Operation
*/
abstract class Operation
{
/**
* 运算符号左边的值
*
* @var int
*/
protected $numberA = 0;
/**
* 运算符号右边的值
*
* @var int
*/
protected $numberB = 0;
/**
* 计算结果
*
* @return mixed
*/
abstract public function getResult();
/**
* 给 numberA 赋值
*
* @param $number
*/
public function setNumberA($number)
{
$this->numberA = $number;
}
/**
* 给 numberB 赋值
*
* @param $number
*/
public function setNumberB($number)
{
$this->numberB = $number;
}
}
/**
* 加法
*
* Class Add
*/
class Add extends Operation
{
/**
* 计算结果
*
* @return int
*/
public function getResult()
{
return $this->numberA + $this->numberB;
}
}
/**
* 减法
*
* Class Sub
*/
class Sub extends Operation
{
/**
* 计算结果
*
* @return int|mixed
*/
public function getResult()
{
return $this->numberA - $this->numberB;
}
}
/**
* 乘法
*
* Class Mul
*/
class Mul extends Operation
{
/**
* 计算结果
*
* @return float|int
*/
public function getResult()
{
return $this->numberA * $this->numberB;
}
}
/**
* 除法
*
* Class Div
*/
class Div extends Operation
{
/**
* 计算结果
*
* @return float|int
*/
public function getResult()
{
if ($this->numberB == 0) {
throw new \InvalidArgumentException('除数不能为0');
}
return $this->numberA / $this->numberB;
}
}
/**
* 工厂抽象类
*
* Class Factory
*/
abstract class Factory
{
/**
* 创建产品
*
* @return mixed
*/
abstract public function create();
}
/**
* 加法工厂
*
* Class AddFactory
*/
class AddFactory extends Factory
{
/**
* 创建加法产品类
*
* @return Add
*/
public function create()
{
return new Add();
}
}
/**
* 减法工厂
*
* Class SubFactory
*/
class SubFactory extends Factory
{
/**
* 创建减法产品类
*
* @return Sub
*/
public function create()
{
return new Sub();
}
}
/**
* 乘法工厂
*
* Class MulFactory
*/
class MulFactory extends Factory
{
/**
* 创建乘法产品类
*
* @return Mul
*/
public function create()
{
return new Mul();
}
}
/**
* 除法工厂
*
* Class DivFactory
*/
class DivFactory extends Factory
{
/**
* 创建除法产品类
*
* @return Div
*/
public function create()
{
return new Div();
}
}
$add = new AddFactory();
$factory = $add->create();
$factory->setNumberA(10);
$factory->setNumberB(20);
echo $factory->getResult();