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 相关文章推荐
php目录管理函数小结
Sep 10 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
Feb 16 PHP
pdo中使用参数化查询sql
Aug 11 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
Nov 07 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
Aug 10 PHP
简单实用的.net DataTable导出Execl
Oct 28 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
百度实时推送api接口应用示例
Oct 21 PHP
PHP  Yii清理缓存的实现方法
Nov 10 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 #PHP
PDO实现学生管理系统
Mar 21 #PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 #PHP
YII2框架使用控制台命令的方法分析
Mar 18 #PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 #PHP
You might like
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
php经典趣味算法实例代码
2020/01/21 PHP
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
Python3多线程操作简单示例
2018/05/22 Python
python opencv实现运动检测
2018/07/10 Python
python增加图像对比度的方法
2019/07/12 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
python实现淘宝购物系统
2019/10/25 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
Linux如何为某个操作添加别名
2015/02/05 面试题
介绍一下grep命令的使用
2012/06/28 面试题
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
实习自我鉴定
2013/12/15 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
2014年质量工作总结
2014/11/22 职场文书
2015年毕业生自荐信范文
2015/03/24 职场文书
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android