Laravel - 致力于提供优质PHP中文学习资源

pFinal.cn

PHP经典设计模式--简单工厂模式

介绍

这也是一个很基本,很简单,很常用的设计模式。

本来我们要获取一个类的实例,需要用到new关键字。但是如果new 直接写到业务代码里,一个类在很多地方都实例化过,以后要是这个类出了什么问题,比如要改个名字(实际中,你更多的可能是修改构造函数方法),那么就尴尬了,需要改很多地方。

工厂模式,顾名思义,就是不用new来获得实例,而是把业务类放进一个工场类里,由工厂(类)『生产』出对应的实例。

实现

SimpleFactory.php
<?php
namespace DesignPatterns\Creational\SimpleFactory;
class SimpleFactory
{
    public function createBicycle(): Bicycle
    {
        return new Bicycle();
    }
}
Bicycle.php
<?php
namespace DesignPatterns\Creational\SimpleFactory;
class Bicycle
{
    public function driveTo(string $destination)
    {
    }
}

使用

$factory = new SimpleFactory();
 $bicycle = $factory->createBicycle();
 $bicycle->driveTo('Paris');

我们需要什么样的实例,就到工厂的实例方法里去拿。这里只定义了一个类的实例,你可以定义更多。

我们看到,业务代码里没有出现 new以及那个具体的业务类, 这样 业务类(class Bicycle)我们可以随便改,以后更新的时候只要在工厂类(class SimpleFactory)里修改一次,就可以一对多的在各处生效了。

但是,这个方法名字 $factory->createBicycle(); 你得起好,如果你要改这个名字,还是得到多个地方改的。

总结

规则 工厂类必须有一个工厂方法; 工厂方法必须能够返回一个其他类的实例; 一次只能创建和返回一个实例;

评论
提交
***n 2017-12-25 10:33:37
通俗的说,以前创建一个对象要使用new,现在把这个过程封装起来了。 假设不使用工厂模式:那么很多地方调用类a,代码就会这样子创建一个实例:new a(),假设某天需要把a类的名称修改,意味着很多调用的代码都要修改