解析PHP工厂模式的好处


Posted in PHP onJune 18, 2013

顾名思义,工厂是可以加工零件的,PHP程序中的工厂模式也有相同的功能,可以方便的使用一个静态的工厂方法来实例化某一个类,那么这样做的好处是什么呢?初学PHP的设计模式,以下是我个人的理解
一般我们实例化一个类会给它一些参数以便在其构析的时候可以根据不同的参数反馈出我们需要的结果。
举例说明,以下是一个User类,非常简单:

<?php
interface IUser{
   function getName();
   function getAge();
}
class User implements IUser{
   protected $_name;
   protected $_age;
   function __construct($name, $age){
      $this->_name = $name;
      $this->_age = (int)$age;
   }
   function getName(){
      return $this->_name;
   }
  function getAge(){
      return $this->_age;
   }
}
?>

我们如果要实例化这个类就要这样:
$u = new User(‘小明‘,19);
一般如果这个类很少使用,那么这样做没什么太大影响,也非常好。
突然我想给这个类增加一个归类,把小明放入学生组,修改下类代码实现非常容易,但如果这个类在我们想修改之前在很多文件地方多次的实例化了,那么想为其增加一个参数就会变的非常烦琐,因为需要替换成:
$u = new User(‘小明‘,19,‘学生‘);
当然我们也可以通过在__construct函数中进行默认值设置来避免这种重复劳动,但事实上从代码优雅角度来说这样很不好,设想我们有一个工厂方法可以通过一个标识来对应一组参数,并把这个参数存放在某个文本文档或是直接以数组的形式存放在工厂类中,我们在调用User类的时候就会变的轻松许多,即便是需要增减参数属性也不需要到处进行代码的替换,下面就是一个工厂类(也可以直接将方法存放在User类)
interface IUser{
    function getName();
    function getAge();
}
class User implements IUser{
   protected $_group;
   protected $_name;
   protected $_age;
  function __construct($name, $age, $group){
      $this->_group = $group;
      $this->_name = $name;
      $this->_age = (int)$age;
  }
  function getName(){
     return $this->_name;
  }
  function getAge(){
      return $this->_age;
  }
}
class Fuser{
   private static $group = array(
       array(‘小明‘,19,‘学生‘),
       array(‘小王‘,19,‘学生‘)
   );
   static function create($id){
      list($name, $age, $group) = self::$group[(int)$id];
      return new User($name, $age, $group);
   }
}
echo Fuser::create(0)->getName();

得到的结果应该是输出“小明”。
PHP 相关文章推荐
php桌面中心(二) 数据库写入
Mar 11 PHP
解析argc argv在php中的应用
Jun 24 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
Nov 19 PHP
php生成圆角图片的方法
Apr 07 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
Jul 01 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
分享3个php获取日历的函数
Sep 25 PHP
php cookie 详解使用实例
Nov 03 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
Laravel5.7 数据库操作迁移的实现方法
Apr 12 PHP
php xhprof使用实例详解
Apr 15 PHP
PHP实现邮件群发的源码
Jun 18 #PHP
解析PHP跨站刷票的实现代码
Jun 18 #PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 #PHP
360通用php防护代码(使用操作详解)
Jun 18 #PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
Jun 18 #PHP
解析PHP计算页面执行时间的实现代码
Jun 18 #PHP
php实现简单洗牌算法
Jun 18 #PHP
You might like
php统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
php里array_work用法实例分析
2015/07/13 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
python用字典统计单词或汉字词个数示例
2014/04/22 Python
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python自动连接ssh的方法
2015/03/07 Python
Python AES加密模块用法分析
2017/05/22 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
《音乐之都维也纳》教学反思
2014/04/16 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
电话营销开场白
2015/05/29 职场文书
Nginx源码编译安装过程记录
2021/11/17 Servers
nginx.conf配置文件结构小结
2022/04/08 Servers