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

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

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

Tags: Prototype原型 模式 笔记

分享到: