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基础学习小结
Apr 17 PHP
php whois查询API制作方法
Jun 23 PHP
CI框架自动加载session出现报错的解决办法
Jun 17 PHP
php自动加载方式集合
Apr 04 PHP
PHP实现二维数组按某列进行排序的方法
Nov 18 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
ThinkPHP框架分布式数据库连接方法详解
Mar 14 PHP
PHP使用Nginx实现反向代理
Sep 20 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
laravel 数据验证规则详解
Oct 23 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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php 文章调用类代码
2011/08/11 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
微信红包随机生成算法php版
2016/07/21 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
js加强的经典分页实例
2013/03/15 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
jQuery中each循环的跳出和结束实例
2017/08/16 jQuery
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
python定时器使用示例分享
2014/02/16 Python
Python中编写ORM框架的入门指引
2015/04/29 Python
python 删除列表里所有空格项的方法总结
2018/04/18 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
python3.6的venv模块使用详解
2018/08/01 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
消防安全检查制度
2014/02/04 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
Python道路车道线检测的实现
2021/06/27 Python
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android