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 相关文章推荐
让你的网站首页自动选择语言转跳
Dec 06 PHP
MySQL授权问题总结
May 06 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
PHP中的函数嵌套层数限制分析
Jun 13 PHP
php+ajax导入大数据时产生的问题处理
Jun 11 PHP
用PHP代码在网页上生成图片
Jul 01 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
PHP微信刮刮卡 附微信接口
Jul 22 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
Jun 12 PHP
php校验公钥是否可用的实例方法
Sep 17 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 进程锁定问题分析研究
2009/11/24 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
Vue异步加载about组件
2017/10/31 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
微信小程序云开发之数据库操作
2019/05/18 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
Python 初始化多维数组代码
2008/09/06 Python
windows下ipython的安装与使用详解
2016/10/20 Python
Python构建XML树结构的方法示例
2017/06/30 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
python生成n个元素的全组合方法
2018/11/13 Python
python将视频转换为全字符视频
2019/04/26 Python
Python简易版停车管理系统
2019/08/12 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
优秀毕业生自我鉴定
2014/01/19 职场文书
客户接待方案
2014/02/26 职场文书
个人总结与自我评价
2014/09/18 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
给校长的一封检讨书
2014/09/20 职场文书
2014年政教处工作总结
2014/12/20 职场文书
店长岗位职责
2015/02/11 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS