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 文件上传功能实现代码
Jun 24 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
php调用dll的实例操作动画与代码分享
Aug 14 PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
从wamp到xampp的升级之路
Apr 08 PHP
PHP动态生成指定大小随机图片的方法
Mar 25 PHP
PHP全功能无变形图片裁剪操作类与用法示例
Jan 10 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 PHP
PHP命令Command模式用法实例分析
Aug 08 PHP
php将字符串转换为数组实例讲解
May 05 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
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
Jquery cookie操作代码
2010/03/14 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现中文分词FMM算法实例
2015/07/10 Python
简单讲解Python中的闭包
2015/08/11 Python
Python2随机数列生成器简单实例
2017/09/04 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
django admin 添加自定义链接方式
2020/03/11 Python
C#如何进行LDAP用户校验
2012/11/21 面试题
外科实习自我鉴定
2013/10/06 职场文书
中学生运动会口号
2014/06/07 职场文书
交通违章检讨书
2014/09/21 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技