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 相关文章推荐
PHP页面间传递参数实例代码
Jun 05 PHP
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
Sep 10 PHP
php 大数据量及海量数据处理算法总结
May 07 PHP
php 注释规范
Mar 29 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
关于使用coreseek并为其做分页的介绍
Jun 21 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
Jun 25 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
laravel 5 实现模板主题功能(续)
Mar 02 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
PHP crc32()函数讲解
Feb 14 PHP
redis+php实现微博(二)发布与关注功能详解
Sep 23 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
[转帖]PHP世纪万年历
2006/12/06 PHP
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
Python获取文件ssdeep值的方法
2014/10/05 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
python unittest实现api自动化测试
2018/04/04 Python
python购物车程序简单代码
2018/04/18 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Django admin model 汉化显示文字的实现方法
2019/08/12 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
Python正则表达式学习小例子
2020/03/03 Python
基于python实现操作git过程代码解析
2020/07/27 Python
Spy++的使用方法及下载教程
2021/01/29 Python
《谁的本领大》教后反思
2014/04/25 职场文书
乳制品整治工作方案
2014/05/29 职场文书
市场营销策划方案
2014/06/11 职场文书
解除劳动合同协议书
2014/09/17 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
党员个人总结范文
2015/02/14 职场文书
会计专业自荐信范文
2015/03/05 职场文书
2015年重阳节主持词
2015/07/04 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js