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 柱状图实现代码
Dec 04 PHP
php中检查文件或目录是否存在的代码小结
Oct 22 PHP
用php来改写404错误页让你的页面更友好
Jan 24 PHP
PHP ignore_user_abort函数详细介绍和使用实例
Jul 15 PHP
php表单敏感字符过滤类
Dec 08 PHP
php基于GD库画五星红旗的方法
Feb 24 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
php面向对象值单例模式
May 03 PHP
PHP用swoole+websocket和redis实现web一对一聊天
Nov 05 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 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
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
js自定义事件代码说明
2011/01/31 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
jQuery实现鼠标跟随效果
2017/02/20 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
Python映射拆分操作符用法实例
2015/05/19 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
如何使用python代码操作git代码
2020/02/29 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
智能钱包:Ekster
2019/11/21 全球购物
学年自我鉴定范文
2013/10/01 职场文书
夜大自我鉴定
2013/10/31 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
跑出一片天观后感
2015/06/08 职场文书
观后感的写法
2015/06/19 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers