解析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 相关文章推荐
Ha0k 0.3 PHP 网页木马修改版
Oct 11 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
修改PHP的memory_limit限制的方法分享
Feb 21 PHP
神盾加密解密教程(三)PHP 神盾解密工具
Jun 08 PHP
php基于表单密码验证与HTTP验证用法实例
Jan 06 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
Aug 08 PHP
php getcwd与dirname(__FILE__)区别详解
Sep 24 PHP
php实现36进制与10进制转换功能示例
Jan 10 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
php7连接MySQL实现简易查询程序的方法
Oct 13 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
ThinkPHP中的常用查询语言汇总
2014/08/22 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
浅析javascript 定时器
2014/12/23 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
2016/03/23 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
简单了解django缓存方式及配置
2019/07/19 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
销售简历自我评价
2014/01/24 职场文书
国庆节文艺活动方案
2014/02/03 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
计算机专业自荐信
2015/03/05 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书