当前位置:首页 > PHP教程 > php面向对象 > 列表

php Prototype原型模式学习笔记

发布:smiling 来源: PHP粉丝网  添加日期:2014-06-10 15:08:40 浏览: 评论:0 

我们一般用new来新增对象,不过很多时候新增一个对象需要一些工作,而星际里面往往会新增某些类的大量的对象,比如新增很多机枪兵和龙骑.

待解决的问题:我们能否减少new的使用,同时避免需要新增对象的时候,了解对象的类名.

思路:php5提供了克隆方法,我们可以新增一个对象,然后每次需要新增和她同类的对象,克隆他就可以了.

原型(Prototype)模式示例,代码如下:

  1. <?php 
  2.  
  3. //机兵类 
  4.  
  5. class Marine 
  6.  
  7.  
  8.   //所属的用户ID 
  9.  
  10.   public $playerID 
  11.  
  12.   //构造函数,参数为用户的id 
  13.  
  14.   public function __construct($id
  15.  
  16.   { 
  17.  
  18.   $this->playerID = $id
  19.  
  20.   } 
  21.  
  22.  
  23. //兵种的管理类 
  24.  
  25. class TroopManager 
  26.  
  27.  
  28.   //数组,用于存放多个兵种的原型 
  29.  
  30.   public $troopPrototype = array(); 
  31.  
  32.   //增加原型,第一个参数为原型的名字,第二个参数为原型对象 
  33.  
  34.   public function addPrototype($name$prototype
  35.  
  36.   { 
  37.  
  38.     $this->troopPrototype[$name] = $prototype
  39.  
  40.   } 
  41.  
  42.   //获取原型的克隆,也就是替代new的方法,参数为原型的名字 
  43.  
  44.   public function getPrototype($name
  45.  
  46.   { 
  47.  
  48.     return clone $this->troopPrototype[$name]; 
  49.  
  50.   } 
  51.  
  52.  
  53. //初始化兵种的管理类 
  54.  
  55. $manager = new TroopManager(); 
  56.  
  57. //初始化两个属于不同玩家的机兵的原型 
  58.  
  59. $m1 = new Marine(1); 
  60.  
  61. $m2 = new Marine(2); 
  62.  
  63. //增加原型,同时用比较容易记忆的名字来命名原型 
  64.  
  65. $manager->addPrototype('Marine of 1'$m1); 
  66.  
  67. $manager->addPrototype('Marine of 2'$m2); 
  68.  
  69. //当需要新增对象的时候,我们可以不必知道对象的类名和初始化的工作 
  70.  
  71. $m3 = $manager->getPrototype('Marine of 1'); 
  72.  
  73. ?> 

用途总结:原型模式可以将新增对象的工作细节封装.

实现总结:需要一个原型管理类,实现增加和获取克隆原型的方法,注意这里由于为了简明,省略了一些东西,实际上我们可以在克隆方法上做一些改动,也可以用接口规范每个原型类.

Tags: Prototype原型 模式 笔记

分享到: