• 工厂方法模式


    简单工厂是违反开放封闭原则的;
    而工厂方法模式就可以规避此问题;

    它需要定义工厂的接口;
    让工厂的子类来确定实例化哪一个具体的产品类;
    延迟了类的实例化;

    应用场景

    要实例化的对象充满不确定性可能会改变的时候;
    要创建的对象的数目和类型是未知的;

    结构

    1个 interface 或者 abstract 工厂父类;
    多个实现 interface 或者继承 abstract 的具体工厂类;

    1个 interface 或者 abstract 产品父类;
    多个实现 interface 或者继承 abstract 的具体产品类;

    具体工厂类和具体产品类一一对应;
    在具体工厂类中实例化具体的产品类

    <?php
    
    /**
     * 工厂方法不需要再做判断了;
     * 但是增加了工作量;
     * 每增加一个产品都需要增加对应的工厂;
     * 这就形成了一种特殊的代码重复;
     */
    interface Factory
    {    
        public function getInstance();
    }
    
    class AddFactory implements Factory
    {
        public function getInstance(){
            return new Add();
        }
    }
    
    class SubFactory implements Factory
    {
        public function getInstance(){
            return new Sub();
        }
    }
    // ...
    abstract class Operation { protected $param1 = 0; protected $param2 = 0; abstract public function getResult(); public function setParam1($param) { $this->param1 = $param; } public function setParam2($param) { $this->param2 = $param; } } class Add extends Operation { public function getResult() { return $this->param1 + $this->param2; } } class Sub extends Operation { public function getResult() { return $this->param1 - $this->param2; } } class Mul extends Operation { public function getResult() { return $this->param1 * $this->param2; } } class Div extends Operation { public function getResult() { if ($this->param2 == 0) { throw new InvalidArgumentException('除数不能为0'); } return $this->param1 / $this->param2; } } $subFactory = new SubFactory(); $operation = $subFactory->getInstance(); $operation->setParam1(1); $operation->setParam2(2); $result = $operation->getResult(); var_dump($result);

    参考文档:https://baijunyao.com/article/162

  • 相关阅读:
    DDOS攻击事件记录
    ansible批量安装zabbix客户端并实现自动发现功能
    利用api更新域名解析ip+端口转发【2】
    利用api更新域名解析ip+端口转发【1】
    网站春节开市休市设置
    获取内网路由器管理页面出口ip
    关于nginx加载配置文件的巨坑
    活动封禁刷票ip
    二十五个Python高级开发技巧,终极干货!建议收藏学习!
    一则故事带你秒懂Python GIL原理!
  • 原文地址:https://www.cnblogs.com/cshaptx4869/p/10423033.html
Copyright © 2020-2023  润新知