解析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使用者状态管理功能的应用
Oct 09 PHP
dedecms采集中可以过滤多行代码的正则表达式
Mar 17 PHP
php去除重复字的实现代码
Sep 16 PHP
php生成略缩图代码
Jul 16 PHP
spl_autoload_register与autoload的区别详解
Jun 03 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
php实现在站点里面添加邮件发送的功能
Apr 28 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 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中与数组相关的函数
2007/03/22 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
JS 判断undefined的实现代码
2009/11/26 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
如何利用Python 进行边缘检测
2020/10/14 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
python 通过exifread读取照片信息
2020/12/24 Python
幼儿园老师辞职信
2014/01/20 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
团结演讲稿范文
2014/05/23 职场文书
小区的门卫岗位职责
2014/10/01 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸