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 相关文章推荐
编译问题
Oct 09 PHP
php中常用编辑器推荐
Jan 02 PHP
Discuz!下Memcache缓存实现方法
May 28 PHP
19个超实用的PHP代码片段
Mar 14 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
PHP使用正则表达式获取微博中的话题和对象名
Jul 18 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
Sep 22 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
Sep 30 PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 PHP
PHP创建XML接口示例
Jul 04 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 简单数组排序实现代码
2009/08/05 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
Javascript模块模式分析
2008/05/16 Javascript
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
JavaScript打印网页指定区域的例子
2014/05/03 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
python实现将内容分行输出
2015/11/05 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
企业总经理岗位职责
2014/02/13 职场文书
员工安全承诺书
2014/05/22 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
库房管理员岗位职责
2015/02/12 职场文书
护士业务学习心得体会
2016/01/25 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
微软团队与 NASA 科学家和惠普企业(HPE)的工程师合作
2022/04/21 数码科技