解析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面向对象全攻略 (九)访问类型
Sep 30 PHP
php下使用SimpleXML 处理XML 文件
Feb 27 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
Oct 17 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
php中eval函数的危害与正确禁用方法
Jun 30 PHP
PHP基本语法总结
Sep 06 PHP
php计算整个目录大小的方法
Jun 01 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
Jul 01 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
基于laravel缓冲cache的用法详解
Oct 23 PHP
php实现微信小程序授权登录功能(实现流程)
Nov 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
php面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
如何打开php的gd2库
2017/02/09 PHP
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
JSONP之我见
2015/03/24 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
管理信息系学生的自我评价
2014/01/11 职场文书
出纳会计岗位职责
2014/03/12 职场文书
《学会合作》教学反思
2014/04/12 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
小学班长竞选稿
2015/11/20 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android