「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

 

posted @ 2018-08-23 18:02  侯大宝  阅读(1618)  评论(0编辑  收藏  举报