アプリケーションシナリオ
演算の数がわからない場合。
たとえば、算術記号+-* /;
構造
1つのファクトリ;
1つのインターフェイスまたは抽象製品の親クラス;
インターフェイスを実装するか抽象を継承する複数の特定の製品クラス。
デモは計算機を実装します
通常のコード実装
<?php
namespace SimpleFactory;
/**
* 不好的示例
*
* Class Bad
* @package SimpleFactory
*/
class Bad
{
/**
* 计算结果
*
* @param int $numberA
* @param string $operate
* @param int $numberB
* @return int|float|int
*/
public function getResult($numberA, $operate, $numberB)
{
switch ($operate) {
case '+':
$result = $numberA + $numberB;
break;
case '-':
$result = $numberA - $numberB;
break;
case '*':
$result = $numberA * $numberB;
break;
case '/':
if ($numberB != 0) {
$result = $numberA / $numberB;
} else {
throw new \InvalidArgumentException('除数不能为0');
}
break;
default:
throw new \InvalidArgumentException('暂不支持的运算');
}
return $result;
}
}
// 调用
$bad = new Bad();
echo $bad->getResult(11,'*',33);
ファクトリクラスを使用する
/**
* 操作类型抽象类
*/
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;
}
}
$add = new Add();
$add->setNumberA(10);
$add->setNumberB(10);
echo $add->getResult();
//由于每次都要执行类,为了减少代码,我们增加了工厂类
/**
* 工厂类
* Class Factory
*/
class Factory
{
/**
* 创建一种运算
*
* @param $operate
* @return Add|Div|Mul|Sub
*/
static function create($operate)
{
switch ($operate) {
case '+':
$result = new Add();
break;
case '-':
$result = new Sub();
break;
case '*':
$result = new Mul();
break;
case '/':
$result = new Div();
break;
default:
throw new \InvalidArgumentException('暂不支持的运算');
}
return $result;
}
}
$result = Factory::create('*');
$result->setNumberA(10);
$result->setNumberB(70);
echo $result->getResult();