加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP设计模式—工厂模式之简单工厂模式

发布时间:2020-12-13 21:24:13 所属栏目:PHP教程 来源:网络整理
导读:? 定义: 简单工厂模式: 将调用者和创建者分离,实现解耦,调用者直接向工厂请求,通过工厂去选择需要实例化的对象,用一个单独的类来做这个创建实例的过程。 ? 代码实例: 问题:假设一个关于个人事务管理的项目中有许多类型的对象,其中一个是 Appointmen

?

定义:

简单工厂模式:将调用者和创建者分离,实现解耦,调用者直接向工厂请求,通过工厂去选择需要实例化的对象,用一个单独的类来做这个创建实例的过程。

?

代码实例:

问题:假设一个关于个人事务管理的项目中有许多类型的对象,其中一个是 Appointment 对象,现在需要通过一种称为 BloggsCal 的格式进行预约数据的交互。后面可能还需要处理更多的数据格式,比如 MegaCal 格式。

1、创建一个抽象类 ApptEncoder

/**
 * 抽象类
 * Class ApptEncoder
 */
abstract class ApptEncoder
{
    public function encode();
}

2、创建 BloggsCal 格式处理类

*
 * BloggsCal 格式处理类
 * Class BloggsApptEncoder
 class BloggsApptEncoder extends encode()
    {
        // TODO: Implement encode() method.
        return "Appointment data encoded in BloggsCal formatn";
    }
}

3、创建 MegaCal 格式处理类

*
 * MegaCal 格式处理类
 * Class MegaApptEncoder
 class MegaApptEncoder return "Appointment data encoded in MegaCal formatn";
    }
}

4、创建工厂类 CommsManager

*
 * 工厂类
 * Class CommsManager
  CommsManager
{
    const BLOGGS = 1;
    const MEGA = 2private $model;

    *
     * CommsManager constructor.
     * @param $model
     */
    function __construct()
    {
        $this->model = ;
    }


    *
     * 通过工厂去选择需要实例化的对象
      getApptEncoder()
    {
        switch ($this->model) {
            case (self::BLOGGS):
                return new BloggsApptEncoder();
            default:
                 MegaApptEncoder();
        }
    }
}

5、调用:

$man = new CommsManager(CommsManager::BLOGGS);
print $man->getApptEncoder()->encode();
MEGA);
$man->getApptEncoder()->encode();

6、结果:

Appointment data encoded in BloggsCal format
Appointment data encoded in MegaCal format

如果后面需要新增一种格式处理,则需要新增一个相应的格式处理类,再到工厂类中增加相应的实例化调用就可以了。

?

总结:

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
但刚才也说了,如果新增一种格式处理,是要修改工厂类的。这就等于说,我们不但对扩展开放了,对修改也开放了,因此违背了“开放-封闭原则”。这时可以使用工厂方法模式。

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读