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支持断点续传的源码
May 16 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
PHP 基于文件头的文件类型验证类函数
May 01 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 PHP
PHP5.3新特性小结
Feb 14 PHP
PHP简单获取及判断提交来源的方法
Apr 22 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
golang 调用 php7详解及实例
Jan 04 PHP
PHP设计模式之装饰器模式定义与用法简单示例
Aug 13 PHP
PHP的mysqli_rollback()函数讲解
Jan 23 PHP
laravel 实现上传图片到本地和前台访问示例
Oct 21 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
如何使用GDB调试PHP程序
2015/12/08 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
Js的MessageBox
2006/12/03 Javascript
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
Prototype Template对象 学习
2009/07/19 Javascript
JavaScript中获取元素索引的函数
2010/09/10 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
python测试驱动开发实例
2014/10/08 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
Python版名片管理系统
2018/11/30 Python
Python实现Event回调机制的方法
2019/02/13 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
顶碗少年教学反思
2014/02/21 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
逃课检讨书
2015/01/26 职场文书
青岛导游词
2015/02/12 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python