为何将单例模式移除

在Cocos2d-JS v3.0之前。全部API差点儿都是从Cocos2d-x中移植过来的,这是Cocos2d生态圈统一性的重要一环。可惜的是,这样的统一性也在非常大程度上限制了Cocos2d-html5的发展,有一些在C++中非常有意义的涉及搬到Html5平台后却使得Cocos2d-html5变得臃肿。所以在3.0版中,我们决定将一些API改造成更适合JavaScript开发者的API。这篇文档中将要展示的是单例类的改造。

cc.SpriteFrameCache为例:

// 在2.2.2版中。假设我们想通过cc.SpriteFrameCache来创建帧图像,再通过帧图像来创建Sprite
cc.SpriteFrameCache.getInstance().addSpriteFrames(s_boxs_plist);
var boxFrame = cc.SpriteFrameCache.getInstance().getSpriteFrame("box_normal_00.png");
var sprite = cc.Sprite.createWithSpriteFrame(boxFrame);

首先,这种代码非常长而且较难阅读。其次,不论cc.SpriteFrameCache的单例对象是否被创建。获取它都将产生函数调用。假设开发人员们不够注意。使用它载入非常多帧图像而且创建非常多精灵又不缓存cc.SpriteFrameCache的单例对象,那么在javascript上必定造成一定程度的性能损失。

最后。也是最重要的是。单例设计模式是为了保护类的单例对象,防止用户反复创建其对象。只是作为javascript开发人员我们都知道。这没什么意义:

// 我们能够非常easy得获取`cc.SpriteFrameCache`的实际单例对象
cc.s_sharedSpriteFrameCache.addSpriteFrames(s_boxs_plist);
// 假设我们想,我们也能够创建还有一个精灵帧缓存对象
var myCache = new cc.SpriteFrameCache();

因此,我们决定Cocos2d-JS v3.0的首要任务就是提供一套更精简更符合JavaScript代码风格的API,这也是重构单例类的好机会。

重构列表

v3.0中部分被重构的单例类例如以下 :

// In engine core
cc.Configuration.getInstance()              --> cc.configuration
cc.ShaderCache.getInstance()                --> cc.shaderCache
cc.TextureCache.getInstance()               --> cc.textureCache
cc.AnimationCache.getInstance()             --> cc.animationCache
cc.SpriteFrameCache.getInstance()           --> cc.spriteFrameCache
cc.Screen.getInstance()                     --> cc.screen
cc.TIFFReader.getInstance()                 --> cc.tiffReader
cc.IMEDispatcher.getInstance()              --> cc.imeDispatcher// In extension
ccs.GUIReader.getInstance()                 --> ccs.guiReader
ccs.SceneReader.getInstance()               --> ccs.sceneReader
ccs.DataReaderHelper                        --> ccs.dataReaderHelper
ccs.SpriteFrameCacheHelper.getInstance()    --> ccs.spriteFrameCacheHelper
ccs.ArmatureDataManager.getInstance()       --> ccs.armatureDataManager
ccs.ActionManager.getInstance()             --> ccs.actionManager
ccs.TriggerMng.getInstance()                --> ccs.triggerManager
ccs.ObjectFactory.getInstance()             --> ccs.objectFactory

这些单例类在3.0中变成了纯对象。类似以下的实现:

cc.screen = {init: function () {//...},fullScreen: function() {//...},requestFullScreen: function (element, onFullScreenChange) {//...},exitFullScreen: function () {//...},autoFullScreen: function (element, onFullScreenChange) {//...}
};

还有一方面,当我们须要继承和扩展时,作为类本身对于结构可能是非常有裨益的,所以并非全部的单例类都适合被重构为对象。

可是我们又希望提供给开发人员统一的API风格,所以我们保留了部分类的类实现而且直接提供了它的单例对象,下面这些类在3.0版中是这样实现的:

cc.AudioEngine.getInstance()        --> cc.audioEngine
cc.Director.getInstance()           --> cc.director
cc.EGLView.getInstance()            --> cc.view
cc.SAXParser.getInstance()          --> cc.saxParser
cc.PlistParser.getInstance()        --> cc.plistParser

请留意全部单例对象都是以首字母小写来命名的。这是为了区分一个变量名代表的是类还是对象。

另外。cc.EGLView是最早在Cocos2d-iPhone中被定义的,所以它的名字来源于iOS中的OpenGL ES视图的名字。可是在Cocos2d-JS中。它不过游戏的视图,能够是WebGL或OpenGL视图但同一时候也可能是Canvas视图,所以我们决定将它重命名为cc.view

结果

重构之后,文档最初的样例在v3.0中将如以下代码所看到的:

cc.spriteFrameCache.addSpriteFrames(s_boxs_plist);
var boxFrame = cc.spriteFrameCache.getSpriteFrame("box_normal_00.png");
var sprite = cc.Sprite.createWithSpriteFrame(boxFrame);

我们衷心希望这样的新的API风格能够让JavaScript开发人员们开发起来更加得心应手。

转载自:http://www.cocos2dx.net/post/260

【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象相关推荐

  1. ABP官方文档(四十五)【集成Hangfire】

    7.2 ABP后台服务 - 集成Hangfire 7.2.1 简介 Hangfire是一个综合性的后台作业管理工具.你可以用Hangfire来替换ABP中默认实现的后台作业管理者.你可以对Hangfi ...

  2. ESP32 官方文档(十五)ESP-MESH

    ESP-MESH ESP-MESH 概述 简介 ESP-MESH概念 术语 树状网络拓扑结构 节点类型 信标帧(Beacon 帧)和 RSSI 阈值 首选父节点 路由表 构建 ESP-MESH 网络 ...

  3. 【AutoMapper官方文档】DTO与Domin Model相互转换(中)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  4. Unity 优化翻译官方文档(二) ------ 平台特定覆盖的纹理压缩格式

    官方文档 : https://docs.unity3d.com/Manual/class-TextureImporterOverride.html 虽然Unity支持许多常见的图像格式作为导入纹理的源 ...

  5. 官方文档太辣鸡?TensorFlow 2.0开源工具书,30天「无痛」上手

    本文转载自机器之心. 项目作者:lyhue1991 「官方文档排布凌乱.搜索难用.API 丑陋不堪--」这是很多人对 TensorFlow 官方文档的吐槽.但吐槽归吐槽,到了工业界,你是无论如何也绕不 ...

  6. Node.js官方文档:到底什么是阻塞(Blocking)与非阻塞(Non-Blocking)?

    译者按: Node.js文档阅读系列之一. 原文: Overview of Blocking vs Non-Blocking 译者: Fundebug 为了保证可读性,本文采用意译而非直译. 这篇博客 ...

  7. ABP官方文档(四十四)【后台作业和后台工人】

    7.1 ABP后台服务 - 后台作业和后台工人 7.1.1 简介 ABP提供了后台作业和后台工人,来执行应用程序中的后台线程的某些任务. 7.1.2 后台作业 由于各种各样的原因,你需要后台作业以队列 ...

  8. Nginx官方文档(三十二)【ngx_http_slice_module|ngx_http_spdy_module】

    ngx_http_slice_module 示例配置 指令 slice 内嵌变量 ngx_http_slice_module 模块(1.9.8)是一个过滤器,它将请求拆分为子请求,每个子请求都返回一定 ...

  9. GO.js官方文档中文版

    GoJs是一个实现图表交互的javaScript库,这篇文章将为你展示使用GoJs时的特征.因为GoJs是依赖hTML5的javaScript库,所以你要确认你开发的页面是在HTML技术的基础上,当然 ...

最新文章

  1. 【从零开始的ROS四轴机械臂控制】(二) - ROS与Gazebo连接,Gazebo仿真及urdf文件修改
  2. 看你的样子对Vue研究挺深的,我司招Vue,五险一金有兴趣吗?
  3. 计算机机械应用,浅析计算机技术在机械自动化的应用(原稿)
  4. Springboot 解决跨域的四种姿势
  5. .gitignore文件_【第1739期】为Git仓库里的.idea文件夹正名
  6. 计算机键盘大赛活动总结,参加技能大赛的活动总结
  7. C++string基本概念
  8. CodeGym—Java自学神器
  9. Linux系统可视化界面与Shell界面切换
  10. 《缠中说禅108课》58:图解分析示范三
  11. iVMS-4200 Vs区别_菲尔·杰克逊揭示了迈克尔·乔丹和科比·布莱恩特之间的关键区别...
  12. Chrome 浏览器下载速度慢?一个开关就可解决
  13. 微信如何屏蔽别人发来的消息,如何屏蔽微信消息
  14. SmartRefreshLayout 下拉刷新上拉加载框架
  15. 时序分析基本概念介绍Timing Derate
  16. 意语口语学习:意大利语的发音
  17. cs,ds,ss,es?即cs,ds,ss,es的区别
  18. SpringBoot配置文件中spring.profiles.active配置详解
  19. 基于FPGA的flash分区实现多功能转换(icap核)
  20. Zip压缩包伪加密原理

热门文章

  1. 设计和实现一个 Chrome 插件提升登录效率
  2. 前端工程师的一大神器——puppeteer
  3. erlang-17版本的编码方式
  4. as3文本框的动态拖拽和编辑
  5. 使用string.Format需要注意的一个性能问题
  6. SQL2K数据库开发十五之表操作查看表中的数据
  7. .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  8. [music]Canon and Gigue in D major
  9. swiper移入暂停_react中swiper注意事项及鼠标划入停止轮播
  10. exfat分配单元大小选多少_安防监控摄像机视角大小和镜头毫米数的基础知识!...