解析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 相关文章推荐
一个简单实现多条件查询的例子
Oct 09 PHP
一个数据采集类
Feb 14 PHP
PHP 数组入门教程小结
May 20 PHP
程序员编程十条戒律
Jul 09 PHP
linux下删除7天前日志的代码(php+shell)
Jan 02 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
php中http_build_query 的一个问题
Mar 25 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
Jun 25 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 PHP
Yii框架的路由配置方法分析
Sep 09 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(6) 面向对象
2010/02/16 PHP
PHP filter_var() 函数 Filter 函数
2012/04/25 PHP
PHP运行模式的深入理解
2013/06/03 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
WebPack基础知识详解
2017/01/16 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
原生JS实现无缝轮播图片
2020/06/24 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
从零学Python之hello world
2014/05/21 Python
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
目前最全的python的就业方向
2018/06/05 Python
Python if语句知识点用法总结
2018/06/10 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
工商企业管理应届生求职信
2013/11/03 职场文书
数学系毕业生求职信
2014/05/29 职场文书
幼儿老师求职信
2014/06/30 职场文书
努力工作保证书
2015/02/28 职场文书
护士医德考评自我评价
2015/03/03 职场文书
幼儿园辞职信
2015/05/13 职场文书
网吧温馨提示
2015/07/17 职场文书
《学会看病》教学反思
2016/02/17 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP