php设计模式之原型模式分析【星际争霸游戏案例】


Posted in PHP onMarch 23, 2020

本文实例讲述了php设计模式之原型模式。分享给大家供大家参考,具体如下:

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

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

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

原型(Prototype)模式示例:

<?php
  //机枪兵类
  class Marine
  {
    //所属的用户ID
    public $playerID

    //构造函数,参数为用户的id
    public function __construct($id)
    {
      $this->playerID = $id;
    }
  }

  //兵种的管理类
  class TroopManager
  {
    //数组,用于存放多个兵种的原型
    public $troopPrototype = array();

    //增加原型,第一个参数为原型的名字,第二个参数为原型对象
    public function addPrototype($name, $prototype)
    {
      $this->troopPrototype[$name] = $prototype;
    }

    //获取原型的克隆,也就是替代new的方法,参数为原型的名字
    public function getPrototype($name)
    {
      return clone $this->troopPrototype[$name];
    }
  }

  //初始化兵种的管理类
  $manager = new TroopManager();

  //初始化两个属于不同玩家的机枪兵的原型
  $m1 = new Marine(1);
  $m2 = new Marine(2);

  //增加原型,同时用比较容易记忆的名字来命名原型
  $manager->addPrototype('Marine of 1', $m1);
  $manager->addPrototype('Marine of 2', $m2);

  //当需要新增对象的时候,我们可以不必知道对象的类名和初始化的工作
  $m3 = $manager->getPrototype('Marine of 1');
?>

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

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个阿拉伯数字转中文数字的函数
Oct 09 PHP
PHP实现的功能是显示8条基色色带
Oct 09 PHP
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
php学习笔记 数组遍历实现代码
Jun 09 PHP
通达OA公共代码 php常用检测函数
Dec 14 PHP
Eclipse的PHP插件PHPEclipse安装和使用
Jul 20 PHP
javascript some()函数用法详解
Nov 13 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
Apr 15 PHP
为你总结一些php系统类函数
Oct 21 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
Oct 17 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 #PHP
php 的多进程操作实践案例分析
Feb 28 #PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 #PHP
php的无刷新操作实现方法分析
Feb 28 #PHP
php下的原生ajax请求用法实例分析
Feb 28 #PHP
You might like
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
javascript天然的迭代器
2010/10/29 Javascript
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
Python类成员继承重写的实现
2020/09/16 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
法学专业应届生求职信
2013/10/16 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
平安建设工作方案
2014/06/02 职场文书
党员作风建设整改方案
2014/10/27 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
交通安全学习心得体会
2016/01/18 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
python3美化表格数据输出结果的实现代码
2021/04/14 Python
Java并发编程必备之Future机制
2021/06/30 Java/Android