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中操作MySQL数据库的一些要注意的问题
Oct 09 PHP
最简单的PHP程序--记数器
Oct 09 PHP
基于mysql的论坛(2)
Oct 09 PHP
百度站点地图(百度sitemap)生成方法分享
Jan 09 PHP
php将session放入memcached的设置方法
Feb 14 PHP
又一个PHP实现的冒泡排序算法分享
Aug 21 PHP
php递归json类实例
Dec 02 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
php实现发送微信模板消息的方法
Mar 07 PHP
PHP中单例模式与工厂模式详解
Feb 17 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
PHP信号处理机制的操作代码讲解
Apr 19 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
Terran热键控制
2020/03/14 星际争霸
php5数字型字符串加解密代码
2008/04/24 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
php解析url的三个示例
2014/01/20 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
javascript动态加载二
2012/08/22 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
WdatePicker.js时间日期插件的使用方法
2017/07/26 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
Python实现定时精度可调节的定时器
2018/04/15 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
户外拓展活动方案
2014/02/11 职场文书
文明市民先进事迹
2014/05/15 职场文书
签约仪式策划方案
2014/06/02 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
2014年组织部工作总结
2014/11/14 职场文书
离职信范本
2015/06/23 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python