アプリケーションシナリオ
インスタンス化されるオブジェクトが不確実性に満ちていて、変更される可能性がある場合。
作成されるオブジェクトの数とタイプは不明です。
構造
1つのインターフェイスまたは抽象製品の親クラス。
インターフェイスを実装するか、抽象を継承する複数の特定の製品クラス。
1つのインターフェイスまたは抽象ファクトリ親クラス。
インターフェイスを実装するか、抽象を継承する複数の具象ファクトリクラス。
特定のファクトリクラスと特定の製品クラス
間の1対1の対応。特定のファクトリクラスで特定の製品クラスをインスタンス化します。
<?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();