zoukankan      html  css  js  c++  java
  • 「PHP」工厂方法模式

    引言
     
      所属:创建型模式,常用设计模式之一
      工厂模式分为:简单工厂模式、工厂方法模式、静态工厂模式、抽象工厂模式。
      下面为工厂方法模式。
      
      参考资料:
    • 《大话设计模式》程杰
     
    模式概述
     
      工厂方法就是为了解决简单工厂扩展性的问题,相信大家再看简单工厂是也发现了其缺陷,
      
      以前简单工厂要扩展的时候,需要修改工厂内容,这就违背了设计模式对外扩展开放,对内修改关闭原则,所以搞了个工厂方法模式,这是我的理解,
        
      涉及元素:
        工厂类(实例化产品A)
        工厂类(实例化产品B)
        产品类A
        产品类B
     
    举个栗子
     
        一个商城网站,支持多种支付功能,例如:支付宝、微信、某银行、某银行……,程序如何设计。
        
        如果按照简单工厂模式的话,声明一个工厂类,由工厂类判断调用哪种支付方式,那么必然存在工厂类不断修改的操作,每增加一个支付方式都要去修改工厂类,违背了【开放封闭】原则
     
        解决的问题:
          
          1. 解决简单工厂【开放封闭】原则问题      
     
        流程图如下:
          
              
      
    程序设计代码:
     
    1. 测试入口index.php
    <?php
    namespace factory_method;
    
    include '../autoload.php';
    
    // 张三支付
    $param = [];
    $param['name'] = '张三';
    $param['money'] = 100;
    
    
    $factory = new WeiXinFactory();
    $mode = $factory->createMode(); // 使用工厂类获取产品类
    $mode->doAction($param); // 执行产品类方法

    2. 工厂类接口,支付宝支付工厂类,微信支付工厂类,银联支付工厂类。

    工厂类接口:PayFactoryInterface.php

    <?php
    
    namespace factory_method;
    
    /**
     * 工厂类接口
     * Interface PayFactoryInterface
     * @package factory_method
     */
    interface PayFactoryInterface
    {
        public function createMode();
    }

    支付宝支付工厂类:ZhiFuBaoFactory.php

    <?php
    namespace factory_method;
    
    /**
     * 支付宝产品类转工厂类
     * Class ZhiFuBaoFactory
     * @package factory_method
     */
    class ZhiFuBaoFactory implements PayFactoryInterface
    {
        public function createMode()
        {
            return new ZhiFuBao();
        }
    }

    微信支付工厂类:WeiXinFactory.php

    <?php
    namespace factory_method;
    
    /**
     * 微信产品类转为工厂类
     * Class WeiXinFactory
     * @package factory_method
     */
    class WeiXinFactory implements PayFactoryInterface
    {
        public function createMode()
        {
            return new WeiXin();
        }
    }

    银联支付工厂类:YinLianFactory.php

    <?php
    namespace factory_method;
    
    /**
     * 银联产品类转工厂类
     * Class YinLianFactory
     * @package factory_method
     */
    class YinLianFactory implements PayFactoryInterface
    {
        public function createMode()
        {
            return new Yinlian();
        }
    }

    3. 产品类接口,支付宝支付产品类,微信支付产品类,银联支付产品类。

    产品类接口:PayInterface.php

    <?php
    namespace factory_method;
    /**
     * Interface PayInterface
     * 定义支付Api规范接口
     */
    interface PayInterface
    {
        /**
         * 发起扣款
         * @return mixed
         */
        public function doAction($param);
    
        /**
         * 记录日志
         * @return mixed
         */
        public function payLog();
    
        /**
         * 发送短信
         * @return mixed
         */
        public function sendNews();
    }

    支付宝支付产品类:ZhiFuBao.php

    <?php
    namespace factory_method;
    
    // 银联
    class ZhiFuBao implements PayInterface
    {
        public function doAction($param)
        {
            $name = $param['name'];
            $money = $param['money'];
            echo $name . '使用支付宝支付,支付金额' . $money;
        }
    
        /**
         * 记录日志
         */
        public function payLog()
        {
    
        }
    
        /**
         * 发送消息
         */
        public function sendNews()
        {
    
        }
    }

    微信支付产品类:WeiXin.php

    <?php
    namespace factory_method;
    
    // 银联
    class WeiXin implements PayInterface
    {
        public function doAction($param)
        {
            $name = $param['name'];
            $money = $param['money'];
            echo $name . '使用微信支付,支付金额' . $money;
        }
    
        /**
         * 记录日志
         */
        public function payLog()
        {
    
        }
    
        /**
         * 发送消息
         */
        public function sendNews()
        {
    
        }
    }

    银联支付产品类:Yinlian.php

    <?php
    namespace factory_method;
    
    // 银联
    class Yinlian implements PayInterface
    {
        public function doAction($param)
        {
            $name = $param['name'];
            $money = $param['money'];
            echo $name . '使用银联支付,支付金额' . $money;
        }
    
        /**
         * 记录日志
         */
        public function payLog()
        {
    
        }
    
        /**
         * 发送消息
         */
        public function sendNews()
        {
    
        }
    }
     
    以下为源码地址

      

      GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master

  • 相关阅读:
    【Dart学习】-- Dart之匿名方法 & 回调函数 & 闭包
    【Dart学习】-- Dart之异常处理
    【Dart学习】-- Dart之操作符
    【Dart学习】-- Dart之注释
    【dart学习】-- Dart之元数据
    【Dart学习】-- Dart之泛型
    利用Aspose文档转图片
    结合仓库设计MVC控制器
    分享一个点赞超过100的漂亮ASP.NET MVC蓝色界面框架
    开发日记:接口开发设计
  • 原文地址:https://www.cnblogs.com/houdabao/p/9525392.html
Copyright © 2011-2022 走看看