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中使用addslashes函数报错问题的解决方法
Feb 06 PHP
2014年最新推荐的10款 PHP 开发框架
Aug 01 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
Aug 08 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
php格式化金额函数分享
Feb 02 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
php构造方法中析构方法在继承中的表现
Apr 12 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
Sep 23 PHP
php断点续传之文件分割合并详解
Dec 13 PHP
laravel中短信发送验证码的实现方法
Apr 25 PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 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
几种显示数据的方法的比较
2006/10/09 PHP
安装APACHE
2007/01/15 PHP
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
监控 url fragment变化的js代码
2010/04/19 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
鼠标滚轮改变图片大小的示例代码
2013/11/20 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python随机读取文件实现实例
2017/05/25 Python
Python实现的生成格雷码功能示例
2018/01/24 Python
Python并行分布式框架Celery详解
2018/10/15 Python
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
python同步两个文件夹下的内容
2019/08/29 Python
Django用户身份验证完成示例代码
2020/04/03 Python
基于opencv实现简单画板功能
2020/08/02 Python
CSS3 @keyframes简单动画实现
2018/02/24 HTML / CSS
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
几道Java和数据库的面试题
2013/05/30 面试题
应届生求职推荐信
2013/10/28 职场文书
医院实习介绍信
2014/01/12 职场文书
打架检讨书500字
2014/01/29 职场文书
保险公司晨会主持词
2014/03/22 职场文书
暑假家长评语大全
2014/04/17 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA