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设计模式 Bridge (桥接模式)
Jun 26 PHP
微博短链接算法php版本实现代码
Sep 15 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
Apr 22 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
PHP Yii框架之表单验证规则大全
Nov 16 PHP
PHP正则获取页面所有图片地址
Mar 23 PHP
PHP HTTP 认证实例详解
Nov 03 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
Yii框架函数简单用法分析
Sep 09 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 时间转换Unix时间戳代码
2010/01/22 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
python fabric使用笔记
2015/05/09 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
python reverse反转部分数组的实例
2018/12/13 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
简单的命令查看安装的python版本号
2020/08/28 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
中专毕业自我鉴定
2013/10/16 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
2014植树节活动总结
2014/03/11 职场文书
大四毕业生自荐书
2014/07/05 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
python数据处理之Pandas类型转换
2022/04/28 Python