• 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 8

    PHP工厂模式

    Posted by 撒得一地 on 2016年1月28日 in PHP笔记
    国外稳定加速器推荐    Express | Vypr

    相关推荐

    PHP单例模式与工厂模式比较
    PHP单例模式

    PHP工厂模式就是用一个工厂方法来替换掉直接new对象的操作。

    在传统习惯中,如果要生成一个类的话,在代码中直接new一个对象,比如:

    class Database{
       
    }
    
    $db = new Database();
    

    下面介绍工厂模式的操作方法:

    class Database{  
    
    }
    
    //创建一个工厂类
    class Factory
    {
       //创建一个静态方法
       static function createDatabase(){
           $db = new Database;
           return $db;
       }
    }
    

    那么,当我们想创建一个数据库类的话,就可以使用这样的方法:

    $db = Factory::createDatabase();
    

    简单工厂模式比直接new一个对象的好处是,比如Database这个类在很多php文件中都有使用到,当Database这个类发生了某些变更,比如修改了类名、或者一些参数发生了变化,那这时候如果你使用的是$db = new Database这种传统方法生成对象,那么在所有包含这种生成对象的php文件代码中都要进行修改。而使用工厂模式,只要在工厂方法或类里面进行修改即可。而且工厂模式是其他设计模式的基础。

    对上面的简单工厂模式再进一步优化,比如:

    利用工厂类生产对象

    <?php
    class Example
    {
        // The parameterized factory method
        public static function factory($type)
        {
            if (include_once 'Drivers/' . $type . '.php') {
                $classname = 'Driver_' . $type;
                return new $classname;
            } else {
                throw new Exception('Driver not found');
            }
        }
    }
    
    // Load a MySQL Driver
    $mysql = Example::factory('MySQL');
    
    // Load an SQLite Driver
    $sqlite = Example::factory('SQLite');
    ?>
    

    简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。

    要理解工厂模式这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时,就会发生问题,系统其他部分 —— 您曾认为完全不相关的部分中也有可能出现级联破坏。

    该问题在于紧密耦合 。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。

    在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。

    看下实例:

    	<?php
    
    	interface IUser
    	{
    	  function getName();
    	}
    
    	class User implements IUser
    	{        
          public $id;
    	  public function __construct( $id ) { }
    
    	  public function getName()
    	  {
    	    return "Jack";
    	  }
    	}
    

    传统方法使用 User 类,一般都是这样:

    	//在页面1
    	$obj = new User(1);
    
    	//在页面2
    	$obj2 = new User(2);
    
    	//在页面3
    	$obj3 = new User(3);
    	....
    

    这时候,由于新的需求,使得User类要新增个参数或者User类名称发生变化,User 类代码发生变动(因为某个奇葩需要改动类名,虽然可能概率很小,这里只是为了举例。之前举的实例有误,已纠正),即:

    	class UserObj implements IUser
    	{
    	  public $id,$pre;
    	  public function __construct( $id ) {...}
    
    	  public function getName()
    	  {
    	    return "Jack";
    	  }
    	}
    

    接着,恐怖的事情发生了,假设之前有 100 个页面引用了之前的 User 类,那么这 100 个页面都要发生相应的改动:

    	//在页面1
    	$obj = new UserObj(1);
    
    	//在页面2
    	$obj = new UserObj(2);
    
    	//在页面3
    	$obj = new UserObj(3);
    	...
    

    本来是一个小小的改动,但因紧密耦合的原因使得改动大吐血。而使用工厂模式则可以避免发生这种情况:

    	//User类为变动前
    	class UserFactory
    	{
    	  public static function Create( $id )
    	  {
    	    return new UserObj( $id );
    	  }
    	}
    
    	//页面1
    	$uo1 = UserFactory::Create( 1 );
    
    	//页面2
    	$uo12 = UserFactory::Create( 2 );
    	....
    

    这时候需求变动,User 类也发生变动:

    	class UserObj implements IUser
    	{
    	  public $id,$pre;
    	  public function __construct( $id ) {...}
    
    	  public function getName()
    	  {
    	    return "Jack";
    	  }
    	}
    

    但是,我们不再需要去改动这 100 个页面,我们要改的仅仅是这个工厂类:

    	//
    	class UserFactory
    	{
    	  public static function Create( $id )
    	  {
    	    return new UserObj( $id );
    	  }
    	}
    

    其他100个页面不用做任何改动,这就是工厂设计模式带来的好处??聪耈ML图:

    工厂模式uml图

    标签:

    上一篇:

    下一篇:

    相关推荐

    8 Comments

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    9 + 3 = ?

    网站地图|广东快乐10分开奖直播

    Copyright © 2015-2019 广东快乐10分开奖直播 All rights reserved.
    闽ICP备15015576号-1,版权所有?psz.

  • 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 北京赛车pk10牛牛买法 澳洲幸运10官方网站 河北十一选五走势图 重庆欢乐生肖什么意思 中国体育彩票顶呱刮兑奖 上海时时乐开奖结果控 中国福彩22选5开奖结果 九州北京赛车pk10下截 6场半全场11087 福利彩票开奖结果查询 欢乐生肖开奖查 齐鲁风采福利彩票开奖在线 6月18日老时时彩 体彩顶呱刮面值50元票 手机投注 时时彩缩水工具app