「PHP」工厂方法模式
- 《大话设计模式》程杰
产品类A
<?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」工厂方法模式的更多相关文章
- Spring中的设计模式:工厂方法模式
导读 工厂方法模式是所有设计模式中比较常用的一种模式,但是真正能搞懂用好的少之又少,Spring底层大量的使用该设计模式来进行封装,以致开发者阅读源代码的时候晕头转向. 文章首发于微信公众号[码猿技术 ...
- 工厂方法模式——创建型模式02
1. 简单工厂模式 在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...
- 设计模式C#合集--工厂方法模式
简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...
- PHP设计模式(二)工厂方法模式(Factory Method For PHP)
简单工厂简述: 简单工厂模式实现了生产产品类的代码跟客户端代码分离,在工厂类中你可以添加需要生成长跑的逻辑代码(new 产品类),但是问题来了,优秀的代码是符合"开闭原则"如果你要 ...
- javascript设计模式-工厂方法模式
工厂方法模式笔记 通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例 对于创建多类对象,简单工厂不太实用,这是简单工厂模式的应用局限,当然这正是工厂方法模式的价值之所在 通过工厂方法模 ...
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
- C#设计模式系列:工厂方法模式(Factory Method)
1. 工厂方法模式简介 1.1 定义 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法模式是以一个类的实例化延迟到其子类. Factory Method模式用于在不指定待创建 ...
- 设计模式(三)工厂方法模式(Factory Pattern)
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- php实现设计模式之 工厂方法模式
<?php /* * *工厂方法模式,创建型模式 定义一个用于创建对象的工厂接口,让子类决定实例化哪一个类.Factory Method使用一个类的实例化延迟到其子类 * * 四个角色: * 工 ...
随机推荐
- AMD,CMD,UMD 三种模块规范 写法格式
一下三块均以 foo.js 为示例文件名,以 jQuery,underscore 为需求组件 ADM:异步模块规范, RequireJs 的支持格式 // 文件名: foo.js define(['j ...
- Selenium_Python接口-Alert类
Alert类的路径:from selenium.webdriver.common.alert import Alert Alert类主要是一些对弹出框的操作,如:获取属性.确认.取消等 接口内容: f ...
- Python 编码为什么那么蛋疼?
据说,每个做 Python 开发的都被字符编码的问题搞晕过,最常见的错误就是 UnicodeEncodeError.UnicodeDecodeError,你好像知道怎么解决,遗憾的是,错误又出现在其它 ...
- 【zz】史上最全设计模式导学目录(完整版)
2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多篇与设计模式学习相关的文章,涵盖了七个面向对象设计原则和24个设计模式(23个GoF设计模式 + 简单工厂模式),为了方便大家 ...
- CodeIgniter框架学习要点
以下内容从兄弟连的CI教学视频中摘抄: http://codeigniter.org.cn/tutorials/ ------------------------------------------- ...
- commons dbcp.jar有什么用
主流数据库连接池之一(DBCP.c3p0.proxool),单独使用DBCP需要使用commons-dbpc.jar.commons-collections.jar.commons-pool.jar三 ...
- 在一个应用中如果同一个Spring 的IOC容器被实例化两次就会出现 CannotAcquireResourceException 异常
现象描述:我在一个Junit 的测试类中实例化IOC容器 : ac = new ClassPathXmlApplicationContext("applicationContext.xml& ...
- iOS之3DTouch的使用---很简单,看我就够啦~~
3DTouch是苹果在iOS9之后新推出的功能,功能大致可以分成两种,一种是长按app的icon,会出现以下的界面,还有一种是在app内部的某个视图上使用,效果如下图. 详细的效果也可以参见微信.微信 ...
- PCB 布线 注意哪些问题记录
1.过孔不能打在焊盘上 ,这样 焊接的时候 会有焊锡 溢出导致 短路. 2.焊盘的线引出时应该从中间引出,不应该从角落引出 3.当有较粗的电源线连接在元器件上时,最好是 有一根小线连接在元器件上,回流 ...
- Lua中的数据结构
1 数组:(lua习惯数组从1开始) a={} , do a[i]= end 2 阵和多维数组 : mt={}//新建一个表,表元素为表 ,N do mt[i]={}//新建一个表,里面的表元素为值 ...