PHP设计模式之工厂模式学习笔记

本文章来给大家介绍php5中的一个新东西,就是工厂模式了,这里是我常用工厂模式的一些学习笔记,下面与大家一同分享有需要了解的朋友可参考.

在大型系统中,许多代码依赖于少数几个关键类.需要更改这些类时,可能会出现困难.例如,假设您有一个从文件读取的 User 类.您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类.这时候,使用工厂模式会很方便.工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动更改.

示例1:显示工厂类的一个示列.

等式的服务器端包括两个部分:数据库和一组 PHP 页面,这些页面允许您添加反馈、请求反馈列表并获取与特定反馈相关的文章

实例代码如下:

  1. <?php 
  2.  interface IUser 
  3.  { 
  4.   function getName(); 
  5.  } 
  6.  class User implements IUser 
  7.  { 
  8.   public function __construct( $id ) { } 
  9.   public function getName() 
  10.   { 
  11.    return "Jack"
  12.   } 
  13.  } 
  14.  class UserFactory 
  15.  { 
  16.   public static function Create( $id ) 
  17.   { 
  18.    return new User( $id ); 
  19.   } 
  20.  } 
  21.  $uo = UserFactory::Create( 1 ); 
  22.  echo$uo->getName()."n" ); 
  23. ?> 

IUser接口定义用户对象应执行什么操作.IUser 的实现称为 User,UserFactory 工厂类则创建 IUser 对象.此关系可以用图1中的UML表示.

图 1. 工厂类及其相关 IUser 接口和用户类如果您使用 php 解释器在命令行上运行此代码,将得到如下结果:

% php factory1.php
Jack
%
 

测试代码会向工厂请求 User 对象,并输出 getName 方法的结果.有一种工厂模式的变体使用工厂方法.类中的这些公共静态方法构造该类型的对象.如果创建此类型的对象非常重要,此方法非常有用.例如,假设您需要先创建对 象,然后设置许多属性.此版本的工厂模式会将该进程封装在单个位置中,这样,不用复制复杂的初始化代码,也不必将复制好的代码在在代码库中到处粘贴.

示例2 显示使用工厂方法的一个示例.

实例代码如下:

  1. <?php 
  2. interface IUser 
  3.   function getName(); 
  4. class User implements IUser 
  5.   public static function Load( $id ) 
  6.   { 
  7.         return new User( $id ); 
  8.   } 
  9.   public static function Create( ) 
  10.   { 
  11.         return new User( null ); 
  12.   } 
  13.   public function __construct( $id ) { } 
  14.   public function getName() 
  15.   { 
  16.     return "Jack"
  17.   } 
  18. $uo = User::Load( 1 ); 
  19. echo$uo->getName()."n" ); 
  20. ?> 

好了上面讲了很多了, 下面我来来看个实例

我们建立以下四个文件

index.php实例代码如下:

  1. <?php 
  2. include_once("f.inc.php"); 
  3. $f=new factory; 
  4. $t1=&$f->create('T1'); 
  5. echo $t1->getName(); 
  6. echo $config
  7. ?> 

f.inc.php实例代码如下:

  1. <?php 
  2. class factory 
  3.  function factory() 
  4.  { 
  5.   $this->mClasses=array 
  6.  
  7. ('T1'=>'t1.inc.php','T2'=>'t2.inc.php'); 
  8.  } 
  9.  function &create($class
  10.  { 
  11.   if (!class_exists($class)) 
  12.   { 
  13.    require_once($this->mClasses[$class]); 
  14.   } 
  15.   return new $class
  16.  } 
  17. ?> 

t1.inc.php实例代码如下:

  1. <?php 
  2. global $config
  3. $config='surfchen'
  4. class T1 
  5.  var $mName='name::T1'
  6.  function getName() 
  7.  { 
  8.   return $this->mName; 
  9.  } 
  10. ?> 

t2.inc.php实例代码如下:

  1. <?php 
  2. class T2 
  3.  function T2() 
  4.  { 
  5.   echo 't2 is ok'
  6.  } 
  7. ?> 

在index.php里,我们通过一个factory类来创建其他的类实例.在factory里,保存有一个数组$this->mClasses,格式为array(“类名”=>”类文件路径”).我们通过factory::create()来创建一个类实例的时候,在create()里,会首先检测类是否存在,如果不存在,就根据$this->mClasses把类对应的类文件包含进来.然后创建并返回一个该类的实例.这样,我们只需要把factory类文件包含进执行的脚本(如index.php)中就可以了.大家可能还注意到了在t1.inc.php中的这两行代码.

实例代码如下:

  1. global $config
  2. $config='surfchen'

为什么需要global呢?因为t1.inc.php是在factory::create中被包含的,t1文件中的变量将会默认为create的函数级变量.所以我们需要对其中的变量(如$config)进行global以便index.php能访问到.运行index.php,将会输出

实例代码如下:

  1. name::T1surfchen 
波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » PHP设计模式之工厂模式学习笔记

110 评论

  1. order viagra without prescription lisinopril 5mg ca lisinopril 5mg price

  2. lasix for sale online lasix cheap hydroxychloroquine 400mg cheap

  3. buy spiriva 9 mcg sale hytrin 1mg cheap buy terazosin 5mg generic

  4. blackjack online real money gambling site empire city casino online

  5. fildena 50mg generic red ed pill finasteride 1mg sale

  6. buy generic cefdinir 300 mg protonix 20mg uk protonix for sale

  7. order alfuzosin 10mg without prescription desyrel sale purchase diltiazem pill

  8. buy generic neurontin 600mg monodox uk order monodox

  9. buy pregabalin without a prescription priligy 90mg sale priligy online order

  10. oral imitrex 25mg levaquin ca order avodart for sale

  11. buy cymbalta 40mg generic cymbalta 40mg pill buy nootropil no prescription

  12. order cialis cialis 5mg cost of cialis

  13. coreg us coreg cost chloroquine sale

  14. proventil 100mcg us cheap albuterol purchase phenazopyridine for sale

  15. buy tetracycline 250mg cheap ozobax buy generic lioresal for sale

  16. buy aurogra no prescription estradiol 2mg sale estradiol over the counter

  17. buy tretinoin cream online cheap tadalafil pills avanafil 100mg price

  18. terbinafine where to buy trimox 250mg oral buy amoxicillin 500mg generic

  19. avapro price buspar brand buspirone 5mg generic

  20. calcitriol online fenofibrate pill buy tricor 200mg without prescription

  21. combivir oral cost accupril purchase quinapril for sale

评论已关闭

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡