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水印技术
Feb 14 PHP
让PHP支持页面回退的两种方法
Jan 10 PHP
php执行sql语句的写法
Mar 10 PHP
php 读取文件乱码问题
Feb 20 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
PHPExcel笔记, mpdf导出
May 03 PHP
基于PHPexecl类生成复杂的报表表头示例
Oct 14 PHP
使用PHP免费发送定时短信的实例
Oct 24 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
Mar 18 PHP
PHP操作路由器实现方法示例
Apr 27 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
PHP实现把数字ID转字母ID
2013/08/12 PHP
php中this关键字用法分析
2016/12/07 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
JS打开新窗口的2种方式
2013/04/18 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
机械系大学毕业生推荐信
2013/11/27 职场文书
学生爱国演讲稿
2014/01/14 职场文书
初中语文教学反思
2014/02/02 职场文书
药学职务聘任书
2014/03/29 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
2014年医务科工作总结
2014/12/18 职场文书
小学运动会通讯稿
2015/07/18 职场文书
防震减灾主题班会
2015/08/14 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
Python装饰器详细介绍
2022/03/25 Python