解析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 Squid中可缓存的动态网页设计
Sep 17 PHP
PHP 实用代码收集
Jan 22 PHP
PHP COOKIE及时生效的方法介绍
Feb 14 PHP
linux下实现定时执行php脚本
Feb 13 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
Yii扩展组件编写方法实例分析
Jun 29 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
php微信开发之图片回复功能
2018/06/14 PHP
Firefox div高度自适应
2009/04/28 Javascript
jquery 表单取值常用代码
2009/12/22 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
JavaScript基础之this详解
2017/06/04 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
JS中的BOM应用
2018/02/02 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
JS实现滑动插件
2020/01/15 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
python实现简易动态时钟
2018/11/19 Python
opencv 阈值分割的具体使用
2020/07/08 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
SQL面试题
2013/12/09 面试题
委托培训协议书
2014/11/17 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers
MySQL 逻辑备份 into outfile
2022/05/15 MySQL