解析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 相关文章推荐
第七节--类的静态成员
Nov 16 PHP
PHP 第一节 php简介
Apr 28 PHP
PHP安全性漫谈
Jun 28 PHP
将时间以距今多久的形式表示,PHP,js双版本
Sep 25 PHP
ajax php传递和接收变量实现思路及代码
Dec 19 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
浅析PHP微信支付通知的处理方式
May 25 PHP
PHP写日志的实现方法
Nov 05 PHP
php使用cookie保存用户登录的用户名实例
Jan 26 PHP
php使用APC实现实时上传进度条功能
Oct 26 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
php使用GD2绘制几何图形示例
Feb 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
javascript document.compatMode兼容性
2010/02/23 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
javascript读写json示例
2014/04/11 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
python代码xml转txt实例
2020/03/10 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
使用python实现学生信息管理系统
2021/02/25 Python
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
求职信的最佳写作思路
2014/02/01 职场文书
扬尘污染防治方案
2014/06/15 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python