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 相关文章推荐
php4的session功能评述(三)
Oct 09 PHP
PHP+MYSQL 出现乱码的解决方法
Aug 08 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
php 代码优化之经典示例
Mar 24 PHP
PHP中strtotime函数使用方法分享
Jan 10 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
Jun 13 PHP
php中的静态变量的基本用法
Mar 20 PHP
php警告Creating default object from empty value 问题的解决方法
Apr 02 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
PHP实现多图上传和单图上传功能
May 17 PHP
PHP的cookie与session原理及用法详解
Sep 27 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
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
浅谈php7的重大新特性
2015/10/23 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
javascript 随机展示头像实现代码
2011/12/06 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
JS面向对象编程详解
2016/03/06 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
python的dict,set,list,tuple应用详解
2014/07/24 Python
python算法表示概念扫盲教程
2017/04/13 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
企业指导教师评语
2014/04/28 职场文书
教师辞职信范文
2015/02/28 职场文书
Django drf请求模块源码解析
2021/06/08 Python