PHP设计模式:工厂方法

前言

工厂方法其实就是简单工厂的改造,以之前的简单工厂计算机为例子,将传入”+” 改造成调用具体的方法

代码

a + $this->b;
    }
}

//定义减法继承于计算器
class Sub extends Calculator implements Reckon
{
    function getResult()
    {
        return $this->a - $this->b;
    }
}

这里我们可以发现,工厂方法和简单工厂可以使用同样的结构。
区别在于

  • 简单工厂通过定义一个静态方法,从而可以传入key来获取相应的方法
//定义一个计算器工厂
class CalculatorFactory
{
    //定义一个创建计算器的方法
    public static function CreateCalculator($operation)
    {
        //这里可以采用switch,但是我不管我就觉得表驱动法好看QwQ
        $operations = [
            '+' => Add::class,
            '-' => Sub::class,
        ];
        return array_key_exists($operation, $operations) ? new $operations[$operation] : '没有这个类';
    }
}
  • 工厂方法是创建各自的工厂,返回相应的对象
//定义一个工厂接口
interface Factory
{
    public function CreateOperation();
}

//加法工厂生产加法
class AddFactory implements Factory
{
    public function CreateOperation()
    {
        return new Add();
    }
}
//减法工厂生产减法
class SubFactory implements Factory
{
    public function CreateOperation()
    {
        return new Sub();
    }
}

输出

  • 简单工厂
$calculator = CalculatorFactory::CreateCalculator("+");
$calculator->a = 1;
$calculator->b = 2;
$result = $calculator->getResult();
echo $result . PHP_EOL;
  • 工厂方法
$operationFactory = new AddFactory();
$operation = $operationFactory->CreateOperation();
$operation->a = 1;
$operation->b = 2;
$result = $operation->getResult();
echo $result . PHP_EOL;

结果都为3

总结

假设这样一个场景,你有很多的文具:铅笔,橡皮擦,小刀...
简单方法相当于一个百宝箱, 你需要什么只要里面有,你可以告诉百宝箱:我要铅笔!百宝箱就会new一个铅笔给你。
工厂方法就是:铅笔放在铅笔盒子,书本放在书本盒子,橡皮擦放在橡皮擦盒子,你需要什么,就去相应的盒子里面取。

你可能感兴趣的:(PHP设计模式:工厂方法)