zoukankan      html  css  js  c++  java
  • PHP设计模式—工厂模式之简单工厂模式

    定义:

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

    代码实例:

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

    1、创建一个抽象类 ApptEncoder

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

    2、创建 BloggsCal 格式处理类

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

    3、创建 MegaCal 格式处理类

    /**
     * MegaCal 格式处理类
     * Class MegaApptEncoder
     */
    class MegaApptEncoder extends ApptEncoder
    {
        public function encode()
        {
            // TODO: Implement encode() method.
            return "Appointment data encoded in MegaCal format
    ";
        }
    }

    4、创建工厂类 CommsManager

    /**
     * 工厂类
     * Class CommsManager
     */
    class CommsManager
    {
        const BLOGGS = 1;
        const MEGA = 2;
        private $model;
    
        /**
         * CommsManager constructor.
         * @param $model
         */
        public function __construct($model)
        {
            $this->model = $model;
        }
    
    
        /**
         * 通过工厂去选择需要实例化的对象
         */
        public function getApptEncoder()
        {
            switch ($this->model) {
                case (self::BLOGGS):
                    return new BloggsApptEncoder();
                default:
                    return new MegaApptEncoder();
            }
        }
    }

    5、调用:

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

    6、结果:

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

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

    总结:

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

  • 相关阅读:
    树莓派添加桌面快捷方式
    计算机网络
    django-auth2
    令牌桶算法-python
    linux centos-7 添加开机自启动脚本
    pymongodb-explain
    哈希表
    tcp/udp
    jemeter之jmeter+ant+jenkins搭建接口自动化测试环境
    jmeter之jmeter + ant + jenkins(二)Jenkins安装
  • 原文地址:https://www.cnblogs.com/woods1815/p/12545603.html
Copyright © 2011-2022 走看看