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验证码类代码分享(已封装成类)
Jul 17 PHP
php方法调用模式与函数调用模式简例
Sep 20 PHP
PHP判断图片格式的七种方法小结
Jun 03 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
PHP中substr函数字符串截取用法分析
Jan 07 PHP
PHP5.3新特性小结
Feb 14 PHP
PHP控制前台弹出对话框的实现方法
Aug 21 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
php封装的pdo数据库操作工具类与用法示例
May 08 PHP
php输出文字乱码的解决方法
Oct 04 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
Oct 13 PHP
PHP大文件及断点续传下载实现代码
Aug 18 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 页面执行时间计算代码
2008/12/04 PHP
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
使用PHP获取汉字的拼音(全部与首字母)
2013/06/27 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
document.all与WEB标准
2020/05/13 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
js实现鼠标单击Tab表单切换效果
2018/05/16 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
python匿名函数的使用方法解析
2019/10/10 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技