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容易忘记的知识点分享
Apr 30 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
PHP中Session引起的脚本阻塞问题解决办法
Apr 08 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
PHP使用flock实现文件加锁的方法
Jul 01 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
php+ajax实现无刷新数据分页的办法
Nov 02 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
laravel ORM 只开启created_at的几种方法总结
Jan 29 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 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
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
Node.js编码规范
2014/07/14 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
vue实现扫码功能
2020/01/17 Javascript
Python中列表的一些基本操作知识汇总
2015/05/20 Python
python实现多线程的两种方式
2016/05/22 Python
Python paramiko模块的使用示例
2018/04/11 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
Python中包的用法及安装
2020/02/11 Python
python实现梯度法 python最速下降法
2020/03/24 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
用友笔试题目
2016/10/25 面试题
学生档案自我鉴定
2013/10/07 职场文书
实习教师自我鉴定
2013/12/09 职场文书
教师自我鉴定
2013/12/13 职场文书
迟到检讨书1000字
2014/01/15 职场文书
六五普法规划实施方案
2014/03/21 职场文书
销售员岗位职责
2015/02/10 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
母亲去世追悼词
2015/06/23 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python