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中查询SQL Server或Sybase时TEXT字段被截断的解决方法
Mar 10 PHP
PHP日期时间函数的高级应用技巧
May 16 PHP
关于php curl获取301或302转向的网址问题的解决方法
Jun 02 PHP
php中http_build_query 的一个问题
Mar 25 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
php过滤XSS攻击的函数
Nov 12 PHP
php中使用array_filter()函数过滤空数组的实现代码
Aug 19 PHP
php关联数组与索引数组及其显示方法
Mar 12 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
Oct 24 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
Nov 22 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开发者的10个技巧
2011/02/25 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
jquery 插件学习(一)
2012/08/06 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
Python 列表list使用介绍
2014/11/30 Python
python斐波那契数列的计算方法
2018/09/27 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
Python中zip()函数的简单用法举例
2019/09/02 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
.net面试题
2015/12/22 面试题
城市规划毕业生求职信
2013/10/10 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
先进个人推荐材料
2014/12/29 职场文书
事业单位聘任报告
2015/03/02 职场文书
报案材料怎么写
2015/05/25 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
送给客户微信问候语!
2019/07/04 职场文书
js Proxy的原理详解
2021/05/25 Javascript
Golang中channel的原理解读(推荐)
2021/10/16 Golang