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面向对象分析设计的经验原则
Sep 20 PHP
PHP网站基础优化方法小结
Sep 29 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 PHP
浅析php与数据库代码开发规范
Aug 08 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
yii操作cookie实例简介
Jul 09 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
PHP中的静态变量及static静态变量使用详解
Nov 05 PHP
thinkPHP模型初始化实例分析
Dec 03 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
Mar 09 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调用Java对象的方法
2006/10/09 PHP
php与paypal整合方法
2010/11/28 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
JQery 渐变图片导航效果代码 漂亮
2010/01/01 Javascript
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
Vue实现购物车场景下的应用
2017/11/27 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
python黑魔法之编码转换
2016/01/25 Python
python fabric实现远程部署
2017/01/05 Python
python之文件读取一行一行的方法
2018/07/12 Python
简单了解python的break、continue、pass
2019/07/08 Python
简单了解python关系(比较)运算符
2019/07/08 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
集体备课反思
2014/02/12 职场文书
交通违章检讨书
2014/09/21 职场文书
2014年法院工作总结
2014/11/24 职场文书
优秀员工推荐材料
2014/12/20 职场文书
小学生差生评语
2014/12/29 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
图解上海144收音机
2021/04/22 无线电