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实现网上点歌(二)
Oct 09 PHP
php 结果集的分页实现代码
Mar 10 PHP
20个PHP常用类库小结
Sep 11 PHP
PHP持久连接mysql_pconnect()函数使用介绍
Feb 05 PHP
php笔记之:有规律大文件的读取与写入的分析
Apr 26 PHP
修改apache配置文件去除thinkphp url中的index.php
Jan 17 PHP
destoon数据库表说明汇总
Jul 15 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
Aug 29 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 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
ThinkPHP惯例配置文件详解
2014/07/14 PHP
php强制运行广告的方法
2014/12/01 PHP
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
PHP生成唯一订单号
2015/07/05 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
微信小程序实现时间进度条功能
2020/11/17 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
完美解决在oj中Python的循环输入问题
2018/06/25 Python
python安装twisted的问题解析
2018/08/21 Python
Python2与Python3的区别实例总结
2019/04/17 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
八年级物理教学反思
2014/01/19 职场文书
个人优缺点总结
2015/02/28 职场文书
初三化学教学反思
2016/02/22 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书