前言
工厂方法其实就是简单工厂的改造,以之前的简单工厂计算机为例子,将传入”+” 改造成调用具体的方法
代码
<?php
//计算器类
class Calculator
{
//定义两个数值
public $a;
public $b;
}
//定义一个计算接口
interface Reckon
{
function getResult();
}
//定义加法继承于计算器
class Add extends Calculator implements Reckon
{
function getResult()
{
return $this->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一个铅笔给你。
工厂方法就是:铅笔放在铅笔盒子,书本放在书本盒子,橡皮擦放在橡皮擦盒子,你需要什么,就去相应的盒子里面取。