引言
 
  所属:创建型模式,常用设计模式之一
  工厂模式分为:简单工厂模式、工厂方法模式、静态工厂模式、抽象工厂模式。
  下面为工厂方法模式。
  
  参考资料:
  • 《大话设计模式》程杰
 
模式概述
 
  工厂方法就是为了解决简单工厂扩展性的问题,相信大家再看简单工厂是也发现了其缺陷,
  
  以前简单工厂要扩展的时候,需要修改工厂内容,这就违背了设计模式对外扩展开放,对内修改关闭原则,所以搞了个工厂方法模式,这是我的理解,
    
  涉及元素:
    工厂类(实例化产品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

「PHP」工厂方法模式的更多相关文章

  1. Spring中的设计模式:工厂方法模式

    导读 工厂方法模式是所有设计模式中比较常用的一种模式,但是真正能搞懂用好的少之又少,Spring底层大量的使用该设计模式来进行封装,以致开发者阅读源代码的时候晕头转向. 文章首发于微信公众号[码猿技术 ...

  2. 工厂方法模式——创建型模式02

    1. 简单工厂模式     在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...

  3. 设计模式C#合集--工厂方法模式

    简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...

  4. PHP设计模式(二)工厂方法模式(Factory Method For PHP)

    简单工厂简述: 简单工厂模式实现了生产产品类的代码跟客户端代码分离,在工厂类中你可以添加需要生成长跑的逻辑代码(new 产品类),但是问题来了,优秀的代码是符合"开闭原则"如果你要 ...

  5. javascript设计模式-工厂方法模式

    工厂方法模式笔记  通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例  对于创建多类对象,简单工厂不太实用,这是简单工厂模式的应用局限,当然这正是工厂方法模式的价值之所在  通过工厂方法模 ...

  6. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  7. C#设计模式系列:工厂方法模式(Factory Method)

    1. 工厂方法模式简介 1.1 定义 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法模式是以一个类的实例化延迟到其子类. Factory Method模式用于在不指定待创建 ...

  8. 设计模式(三)工厂方法模式(Factory Pattern)

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  9. php实现设计模式之 工厂方法模式

    <?php /* * *工厂方法模式,创建型模式 定义一个用于创建对象的工厂接口,让子类决定实例化哪一个类.Factory Method使用一个类的实例化延迟到其子类 * * 四个角色: * 工 ...

随机推荐

  1. Python学习系列----第三章 控制流

    在python中有三种控制流语句,分别是: if.for.while. 2.1 if 语句 if 语句用来检验一个条件,如果条件为真,我们运行一块语句(称为 if-块),否 则我们处理另外一块语句(称 ...

  2. 二维数组中的查找(C++和Python实现)

    (说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列 ...

  3. ORACLE 角色授权

    直接例子: 1.CREATE USER 用户名 identified by 密码 default tablespace 表空间名;GRANT CONNECT TO 用户名; GRANT RESOURC ...

  4. Hibernate、Mybatis与Spring Data JPA

    从零开始集成Springboot+MyBatis+JPA https://www.jianshu.com/p/e14c4a6f6871 MyBatis 与Hibernate的区别 http://xhr ...

  5. Linux的man手册共有以下几个章节

    Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. Linux的man手册共有以下几个章节: 1.Standard commands (标准命令) 2. ...

  6. Linux-python的一些小问题

    1.python版本和pip版本 2.PATH和PYTONPATH 1.python版本和pip版本 1.python版本 一般Ubuntu里面都装的不止一个版本的python,比如有python2. ...

  7. jsp 页面显示格式化的日期

    在页面引入 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 使用 ...

  8. (二)给Centos配置网络以及使用xshell远程连接Centos

    好吧,我对网络协议以及ip配置知识的匮乏,让我在这里折腾了将近一天才搞定.可以说基本上网上遇到的问题我都遇到了.在这里,记下正确的步骤来给Centos配置网络.希望以后少走弯路. 首先我要说明的是,我 ...

  9. Type Systems

    This section deals with more theoretical aspects of types. A type system is a set of rules used by a ...

  10. 上下文(context):相关的内容

    简单的理解,就是相关的内容 模式是在某种特定的场景(context)下某个不断重复出现的问题的解决方案. 环境:上下文:来龙去脉 上下文:语境:环境 网络背景:情境:脉络 context其实说白了,和 ...