工厂【Factory】

实例

// 操作类
abstract class Operation
{
    protected $a = 0;
    protected $b = 0;

    public function setA($a)
    {
        $this->a = $a;
    }

    public function setB($b)
    {
        $this->b = $b;
    }

    abstract protected function getResult();
}

// 加
class Add extends Operation
{
    public function getResult()
    {
        return $this->a + $this->b;
    }
}

// 减
class Sub extends Operation
{
    public function getResult()
    {
        return $this->a - $this->b;
    }
}

// 乘
class Mul extends Operation
{
    public function getResult()
    {
        return $this->a * $this->b;
    }
}

// 除
class Div extends Operation
{
    public function getResult()
    {
        return $this->a / $this->b;
    }
}

// 工厂接口
interface IFactory
{
    public function createOperation();
}

class AddFactory implements IFactory
{
    public function createOperation()
    {
        return new Add();
    }
}

class SubFactory implements IFactory
{
    public function createOperation()
    {
        return new Sub();
    }
}

class MulFactory implements IFactory
{
    public function createOperation()
    {
        return new Mul();
    }
}

class DivFactory implements IFactory
{
    public function createOperation()
    {
        return new Div();
    }
}

$operationFactory = new AddFactory();
$operation = $operationFactory->createOperation();
$operation->setA(10);
$operation->setB(10);
echo $operation->getResult(), PHP_EOL; // 20

总结

简单工厂模式 (Simple Factory)

工厂方法模式 (Factory Method)

一句话总结:
简单工厂是集中式创建,易用但难扩展;工厂方法是分散式创建,易扩展但将工厂选择权留给了客户端。

意图

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

优点

缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

使用场景

注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。