PHPデザインパターンのシンプルなファクトリパターン(ファクトリパターン)

アプリケーションシナリオ

演算の数がわからない場合。
たとえば、算術記号+-* /;

構造

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();

おすすめ

転載: blog.csdn.net/qq_41526316/article/details/108516171