PHP设计模式之工厂方法设计模式实例分析


Posted in PHP onApril 25, 2018

本文实例讲述了PHP设计模式之工厂方法设计模式。分享给大家供大家参考,具体如下:

一、什么是工厂方法模式

作为一种创建型设计模式,工厂方法模式就是要创建“某种东西”。对于工厂方法,要创建的“东西”是一个产品,这个产品与创建它的类之间不存在绑定。实际上,为了保持这种松耦合,客户会通过一个工厂发出请求,再由工厂创建所请求的产品。利用工厂方法模式,请求者只发出请求,而不具体创建产品。

二、什么时候使用工厂方法模式

如果实例化对象的子类可能改变,就要使用工厂方法模式。

三、一般工厂方法模式

使用一般工厂方法模式时,客户只包含工厂的引用,一个工厂生产一种产品。增加一种产品的同时需要增加一个新工厂类和一个新产品类。

<?php
/**
*  一般工厂方法设计模式
**/
//工厂抽象类
abstract class Factory
{
  protected abstract function produce();
  public function startFactory()
  {
    $pro = $this->produce();
    return $pro;
  }
}
//文本工厂
class TextFactory extends Factory
{
  protected function produce()
  {
    $textProduct = new TextProduct();
    return $textProduct->getProperties();
  }
}
//图像工厂
class ImageFactory extends Factory
{
  protected function produce()
  {
    $imageProduct = new ImageProduct();
    return $imageProduct->getProperties();
  }
}
//产品类接口
interface Product
{
  public function getProperties();
}
//文本产品
class TextProduct implements Product
{
  private $text;
  function getProperties()
  {
    $this->text = "此处为文本";
    return $this->text;
  }
}
//图像产品
class ImageProduct implements Product
{
  private $image;
  function getProperties()
  {
    $this->image = "此处为图像";
    return $this->image;
  }
}
//客户类
class Client
{
  private $textFactory;
  private $imageFactory;
  public function __construct()
  {
    $this->textFactory = new TextFactory();
    echo $this->textFactory->startFactory() . '<br />';
    $this->imageFactory = new ImageFactory();
    echo $this->imageFactory->startFactory() . '<br />';
  }
}
$client = new Client();
/*运行结果:
此处为文本
此处为图像
*/
?>

四、参数化工厂方法模式

使用参数化工厂方法模式时,客户包含工厂和产品的引用,发出请求时需要指定产品的种类,一个工厂生产多种产品。增加一种产品时只需要增加一个新产品类即可。

<?php
/**
*  参数化工厂方法设计模式
**/
//工厂抽象类
abstract class Factory
{
  protected abstract function produce(Product $product);
  public function startFactory(Product $product)
  {
    $pro = $this->produce($product);
    return $pro;
  }
}
//工厂实现
class ConcreteFactory extends Factory
{
  protected function produce(Product $product)
  {
    return $product->getProperties();
  }
}
//产品类接口
interface Product
{
  public function getProperties();
}
//文本产品
class TextProduct implements Product
{
  private $text;
  public function getProperties()
  {
    $this->text = "此处为文本";
    return $this->text;
  }
}
//图像产品
class ImageProduct implements Product
{
  private $image;
  public function getProperties()
  {
    $this->image = "此处为图像";
    return $this->image;
  }
}
//客户类
class Client
{
  private $factory;
  private $textProduct;
  private $imageProduct;
  public function __construct()
  {
    $factory = new ConcreteFactory();
    $textProduct = new TextProduct();
    $imageProduct = new ImageProduct();
    echo $factory->startFactory($textProduct) . '<br />';
    echo $factory->startFactory($imageProduct) . '<br />';
  }
}
$client = new Client();
/*运行结果:
此处为文本
此处为图像
*/
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
解决中英文字符串长度问题函数
Jan 16 PHP
PHP的范围解析操作符(::)的含义分析说明
Jul 03 PHP
php调用dll的实例操作动画与代码分享
Aug 14 PHP
Apache服务器无法使用的解决方法
May 08 PHP
深入PHP FTP类的详解
Jun 13 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
php的GD库imagettftext函数解决中文乱码问题
Jan 24 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
Aug 01 PHP
php获取文件后缀的9种方法
Mar 22 PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
原生php实现excel文件读写的方法分析
Apr 25 #PHP
PHP操作Redis常用技巧总结
Apr 24 #PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 #PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 #PHP
php接口实现拖拽排序功能
Apr 23 #PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 #PHP
PHP生成推广海报的方法分享
Apr 22 #PHP
You might like
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
深入理解Python中各种方法的运作原理
2015/06/15 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
Python实现的读写json文件功能示例
2018/06/05 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
python实现人机猜拳小游戏
2020/02/03 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
python 实现的车牌识别项目
2021/01/25 Python
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
青年文明号事迹材料
2014/01/18 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
安全月宣传标语
2014/10/07 职场文书
教师个人考察材料
2014/12/16 职场文书
文明礼貌主题班会
2015/08/14 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
mysql 索引合并的使用
2021/08/30 MySQL
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS