登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

zczhangchi 的博客

学习笔记

 
 
 

日志

 
 

PHP与魔兽--看PHP设计模式 01(转)  

2009-10-30 11:52:12|  分类: php资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

通过魔兽看PHP设计模式

前段时间看到有人用魔兽来解释设计模式,感觉很有意思,于是我把它改了改,又添加了些设计模式内容,今天发出来。有些地方借鉴了前人的内容,没有注明,请前人不要见怪啊。

这里用大家感兴趣的魔兽3来讨论PHP的几种常见的设计模式:单件模式、策略模式、工厂模式、观察者模式。今天就讲这四个吧,以后继续。这些设计模式,都是针对面向对象来说的,所以都用PHP5,另外在这里我想说的是PHP4从2008年8月8日(我记得是和北京奥运会同一天,没查证,呵呵)的时候官方就发了最后一个PHP4的补丁,这意味这PHP4的时代已经终结,所以,我建议大家现在就别理PHP4吧,就以PHP5来说吧。

一、单件模式:

问题的提出:某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

问题的解决:那么下面我们就开始玩魔兽吧。首先双击war3.exe,这时候就开始运行魔兽了。我们用代码来实现吧。。

Php代码
  1. < ?php   
  2. class War3 {   
  3.     public   function __construct() {   
  4.         echo "War3 is Running.",   
  5.      }   
  6. }   
  7. $war = new War3();  
< ?php class War3 {    public   function __construct() {        echo "War3 is Running.",    }}$war = new War3();

运行!很好,输出War3 is Running.我们已经可以开始游戏了,但是,如果我在代码末尾再加入

$war2 = new War3();

$war3 = new War3();

会怎么样呢?我们试试,输出结果:War3 is Running.War3 is Running.War3 is Running.完了,如果不小心双击了两次就开了3个魔兽,那如果再双击几次,那电脑肯定爆掉。。。我们还是来想想解决方法吧。。。既然我们不能这么随意的就把这个类实例化了,那么我们就把构造函数改成私有方法。

Php代码
  1. class War3 {   
  2.     private    function __construct() {   
  3.         echo "War3 is Running.",   
  4.      }   
  5. }  
class War3 {    private    function __construct() {        echo "War3 is Running.",    }}

可是私有变量外部是无法访问的,这样以来,我们就连一个都打不开了啊。别急,我们再给他加一个不用通过实例化,外部也能访问的函数,那就是静态函数

Php代码
  1. class War3 {   
  2.     private    function __construct() {   
  3.         echo "War3 is Running.",   
  4.      }   
  5.   
  6.     public static    function runWar() {   
  7.   
  8. }   
  9. }  
class War3 {    private    function __construct() {        echo "War3 is Running.",    }    public static    function runWar() {}}

通过这个静态的方法runWar()我们来控制类War3的实例化,那么还缺上一个标识,我们再创建一个标识,通过这个标识来表示我们的类是否已经实例化,如果实例化,直接返回句柄就行了。把类修改成

Php代码
  1. class War3 {   
  2.     protected static $_instance = null;   
  3.     private    function __construct() {   
  4.         echo "War3 is Running.",   
  5.      }   
  6.   
  7.     public static    function runWar() {   
  8.         if (null === self: :$_instance) {   
  9.              self: :$_instance = new self();   
  10.          }   
  11.   
  12.         return self: :$_instance;   
  13.      }   
  14. }  
class War3 {    protected static $_instance = null;    private    function __construct() {        echo "War3 is Running.",    }    public static    function runWar() {        if (null === self: :$_instance) {            self: :$_instance = new self();        }        return self: :$_instance;    }}

当然,我们运行魔兽时的实例化也要换种方法,就通过

$war = War3: :runWar();

就能开始玩魔兽了,好了,下面把完整的代码附上来:

Php代码
  1. < ?php   
  2. class War3 {   
  3.     protected static $_instance = null;   
  4.     private    function __construct() {   
  5.         echo "War3 is Running.",   
  6.      }   
  7.   
  8.     public static    function runWar() {   
  9.         if (null === self: :$_instance) {   
  10.              self: :$_instance = new self();   
  11.          }   
  12.   
  13.         return self: :$_instance;   
  14.      }   
  15. }   
  16. $war = War3: :runWar();   
  17. $war2 = War3: :runWar();   
  18. $war3 = War3: :runWar();   
  19. ?>  
< ?php class War3 {    protected static $_instance = null;    private    function __construct() {        echo "War3 is Running.",    }    public static    function runWar() {        if (null === self: :$_instance) {            self: :$_instance = new self();        }        return self: :$_instance;    }}$war = War3: :runWar();$war2 = War3: :runWar();$war3 = War3: :runWar();?>

运行一下,结果是:War3 is Running.太好了,我双击了这么多次,也就只运行了一个魔兽,现在随便你怎么打开,机子都不会爆掉了。这就是传说中的单价模式,主要用于一些很占资源的而且实例仅有一个实例就够用的东西,比如,zendframework中的Zend_Controller_Front前端控制器,就是采用单价模式来设计的,大家有兴趣的话可以看看那个。

  评论这张
 
阅读(117)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018