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 simple_html_dom.php+正则 采集文章代码
Dec 24 PHP
php中使用DOM类读取XML文件的实现代码
Dec 14 PHP
eaglephp使用微信api接口开发微信框架
Jan 09 PHP
php数组去重复数据示例
Feb 25 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
PHP产生不重复随机数的5个方法总结
Nov 12 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
php实现字符串首字母大写和单词首字母大写的方法
Mar 14 PHP
php实现统计网站在线人数的方法
May 12 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 09 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 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 Memcache 中实现消息队列
2009/11/24 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
快速了解python leveldb
2018/01/18 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
英国手机零售商:Metrofone
2019/03/18 全球购物
普通大学毕业生自荐信
2013/11/04 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
计算机多媒体专业自荐信
2014/07/04 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
个人借条范本
2015/05/25 职场文书
爱国之歌(8首)
2019/09/29 职场文书
超级详细实用的pycharm常用快捷键
2021/05/12 Python
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript