解析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 应用程序的安全 -- 不能违反的四条安全规则
Nov 26 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
php实现爬取和分析知乎用户数据
Jan 26 PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 PHP
PHP 闭包详解及实例代码
Sep 28 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 09 PHP
PHP基于cookie实现统计在线人数功能示例
Jan 16 PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
Oct 18 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
Yii清理缓存的方法
2016/01/06 PHP
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
Python字符串格式化
2015/06/15 Python
python中reload(module)的用法示例详解
2017/09/15 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
python实现电子词典
2020/03/03 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
简单介绍HTML5中audio标签的使用
2015/09/24 HTML / CSS
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
初中家长寄语
2014/04/02 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
党员志愿者活动总结
2014/06/26 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
观后感的写法
2015/06/19 职场文书
建立共青团委员会的请示
2019/04/02 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
设置IIS Express并发数
2022/07/07 Servers