当前位置:首页 > PHP教程 > php高级应用 > 列表

php工厂方法模式是什么

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-18 15:30:44 浏览: 评论:0 

php工厂方法模式属于创建型模式,是常用设计模式之一,并且工厂模式还分为简单工厂模式、工厂方法模式、静态工厂模式以及抽象工厂模式,而工厂方法就是为了解决简单工厂扩展性的问题。

引言

所属:创建型模式,常用设计模式之一

工厂模式分为:简单工厂模式、工厂方法模式、静态工厂模式、抽象工厂模式。

下面为工厂方法模式。

模式概述

工厂方法就是为了解决简单工厂扩展性的问题,相信大家再看简单工厂是也发现了其缺陷,以前简单工厂要扩展的时候,需要修改工厂内容,这就违背了设计模式对外扩展开放,对内修改关闭原则,所以搞了个工厂方法模式,这是我的理解,   

涉及元素:

工厂类(实例化产品A)

工厂类(实例化产品B)

产品类A

产品类B

举个栗子

一个商城网站,支持多种支付功能,例如:支付宝、微信、某银行、某银行……,程序如何设计。

如果按照简单工厂模式的话,声明一个工厂类,由工厂类判断调用哪种支付方式,那么必然存在工厂类不断修改的操作,每增加一个支付方式都要去修改工厂类,违背了【开放封闭】原则

解决的问题:

1. 解决简单工厂【开放封闭】原则问题      

流程图如下:

php工厂方法模式是什么

程序设计代码:

1. 测试入口index.php

  1. <?php 
  2.  
  3. namespace factory_method; 
  4.  
  5.  
  6.  
  7. include '../autoload.php'
  8.  
  9.  
  10.  
  11. // 张三支付 
  12.  
  13. $param = []; 
  14.  
  15. $param['name'] = '张三'
  16.  
  17. $param['money'] = 100; 
  18.  
  19.  
  20.  
  21.  
  22.  
  23. $factory = new WeiXinFactory(); 
  24.  
  25. $mode = $factory->createMode(); // 使用工厂类获取产品类 
  26.  
  27. $mode->doAction($param); // 执行产品类方法 

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

工厂类接口:PayFactoryInterface.php

  1. <?php 
  2.  
  3.  
  4.  
  5. namespace factory_method;/** 
  6.  
  7.  * 工厂类接口 
  8.  
  9.  * Interface PayFactoryInterface 
  10.  
  11.  * @package factory_method */interface PayFactoryInterface 
  12.  
  13. {    public function createMode(); 
  14.  

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

  1. <?php 
  2.  
  3. namespace factory_method;/** 
  4.  
  5.  * 支付宝产品类转工厂类 
  6.  
  7.  * Class ZhiFuBaoFactory 
  8.  
  9.  * @package factory_method */class ZhiFuBaoFactory implements PayFactoryInterface 
  10.  
  11. {    public function createMode() 
  12.  
  13.     {        return new ZhiFuBao(); 
  14.  
  15.     } 
  16.  

微信支付工厂类:WeiXinFactory.php

  1. <?php 
  2.  
  3. namespace factory_method;/** 
  4.  
  5.  * 微信产品类转为工厂类 
  6.  
  7.  * Class WeiXinFactory 
  8.  
  9.  * @package factory_method */class WeiXinFactory implements PayFactoryInterface 
  10.  
  11. {    public function createMode() 
  12.  
  13.     {        return new WeiXin(); 
  14.  
  15.     } 
  16.  

银联支付工厂类:YinLianFactory.php

  1. <?php 
  2.  
  3. namespace factory_method;/** 
  4.  
  5.  * 银联产品类转工厂类 
  6.  
  7.  * Class YinLianFactory 
  8.  
  9.  * @package factory_method */class YinLianFactory implements PayFactoryInterface 
  10.  
  11. {    public function createMode() 
  12.  
  13.     {        return new Yinlian(); 
  14.  
  15.     } 
  16.  

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

产品类接口:PayInterface.php

  1. <?php 
  2.  
  3. namespace factory_method;/** 
  4.  
  5.  * Interface PayInterface 
  6.  
  7.  * 定义支付Api规范接口 */interface PayInterface 
  8.  
  9. {    /** 
  10.  
  11.      * 发起扣款 
  12.  
  13.      * @return mixed     */ 
  14.  
  15.     public function doAction($param);    /** 
  16.  
  17.      * 记录日志 
  18.  
  19.      * @return mixed     */ 
  20.  
  21.     public function payLog();    /** 
  22.  
  23.      * 发送短信 
  24.  
  25.      * @return mixed     */ 
  26.  
  27.     public function sendNews(); 
  28.  

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

  1. <?php 
  2.  
  3. namespace factory_method;// 银联class ZhiFuBao implements PayInterface 
  4.  
  5. {    public function doAction($param
  6.  
  7.     {        $name = $param['name'];        $money = $param['money'];        echo $name . '使用支付宝支付,支付金额' . $money
  8.  
  9.     }    /** 
  10.  
  11.      * 记录日志     */ 
  12.  
  13.     public function payLog() 
  14.  
  15.     { 
  16.  
  17.  
  18.  
  19.     }    /** 
  20.  
  21.      * 发送消息     */ 
  22.  
  23.     public function sendNews() 
  24.  
  25.     { 
  26.  
  27.  
  28.  
  29.     } 
  30.  

微信支付产品类:WeiXin.php

  1. <?php 
  2.  
  3. namespace factory_method;// 银联class WeiXin implements PayInterface 
  4.  
  5. {    public function doAction($param
  6.  
  7.     {        $name = $param['name'];        $money = $param['money'];        echo $name . '使用微信支付,支付金额' . $money
  8.  
  9.     }    /** 
  10.  
  11.      * 记录日志     */ 
  12.  
  13.     public function payLog() 
  14.  
  15.     { 
  16.  
  17.  
  18.  
  19.     }    /** 
  20.  
  21.      * 发送消息     */ 
  22.  
  23.     public function sendNews() 
  24.  
  25.     { 
  26.  
  27.  
  28.  
  29.     } 
  30.  

银联支付产品类:Yinlian.php

  1. <?php 
  2.  
  3. namespace factory_method;// 银联class Yinlian implements PayInterface 
  4.  
  5. {    public function doAction($param
  6.  
  7.     {        $name = $param['name'];        $money = $param['money'];        echo $name . '使用银联支付,支付金额' . $money
  8.  
  9.     }    /** 
  10.  
  11.      * 记录日志     */ 
  12.  
  13.     public function payLog() 
  14.  
  15.     { 
  16.  
  17.  
  18.  
  19.     }    /** 
  20.  
  21.      * 发送消息     */ 
  22.  
  23.     public function sendNews() 
  24.  
  25.     { 
  26.  
  27.  
  28.  
  29.     } 
  30.  

以下为源码地址

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

Tags: php工厂方法模式

分享到: