/******************************************************************************* * * Nx对象工厂 * * * * 2021.12.10 ******************************************************************************/ var NxFactory = cc.Class( { name: "NxFactory", // 创建 ctor: function() { this.counter = 1000; // 计数器 this.instances = {}; // 实例列表 }, // 销毁 destroy: function() { let count = 0; for( let k in this.instances ) { this._deleteObject( k ); ++count; } this.instances = {}; if( CC_DEBUG && count > 0 ) { nx.logger.warn( "[对象工厂]有残留:%d个", count ); } }, // 创建 create: function( _jsfile, _args ) { return this._createObject( nx.dt.newUUID(), _jsfile, _args ); }, // 创建单例服务 createService: function( _name, _jsfile, _args ) { _jsfile = _jsfile || _name; return this._createObject( _name, _jsfile, _args ); }, // 删除 remove: function( _idOrNameOrObject ) { return this._deleteObject( _idOrNameOrObject ); }, // 获取实例 query: function( _idOrName ) { var inst = this.instances[ _idOrName ]; if( !inst ) { nx.logger.warn( "[对象工厂]查找失败:" + _idOrName ); } return inst; }, // 获取对象的UUID getUUID: function( _binder, _create ) { // 如果binder是字符串,直接返回保持不变 if( nx.dt.strNEmpty( _binder ) ) { return _binder; } // 如果binder是对象,并且已经有UUID,直接返回 if( nx.dt.objGood( _binder ) && nx.dt.strNEmpty( _binder.nxUUID ) ) { return _binder.nxUUID; } // 新建 if( _create ) { _binder.nxUUID = nx.dt.newUUID( _binder.__classname__ ); return _binder.nxUUID; } return ""; }, // 创建实例 _createObject: function( _uid, _jsfile, _args ) { // 参数合法检测 if( nx.dt.strEmpty( _uid ) || nx.dt.strEmpty( _jsfile ) ) { nx.logger.error( "[对象工厂]创建失败,参数不合法!" ); return null; } // 重复判定 if( nx.dt.objGood( this.instances[ _uid ] ) ) { nx.logger.error( "[对象工厂]创建失败,重复创建" ); return null; } // 脚本读取 var mod = require( _jsfile ); if( !mod ) { nx.logger.error( "[对象工厂]创建失败,脚本无效:" + _jsfile ); return null; } // 实例化 var inst = new mod(); inst.nxUUID = _uid; inst._jsfile = _jsfile; if( !inst.initialize( _args || {} ) ) { nx.logger.error( "[对象工厂]创建初始化失败: %s:%s.js", _uid, _jsfile ); return null; } this.instances[ _uid ] = inst; // nx.logger.debug( "[对象工厂]创建对象: %s:%s.js", _uid, _jsfile ); return inst; }, // 销毁实例 _deleteObject: function( _idOrNameOrObject ) { // 如果是对象,那么必须存在nxUUID属性 var _uid = _idOrNameOrObject; if( nx.dt.objGood( _idOrNameOrObject ) && nx.dt.strNEmpty( _idOrNameOrObject.nxUUID ) ) { _uid = _idOrNameOrObject.nxUUID; } if( nx.dt.strEmpty( _uid ) ) { nx.logger.warn( "[对象工厂]删除失败,参数非法" ); return false; } var object = this.instances[ _uid ]; if( !object ) { nx.logger.warn( "[对象工厂]删除失败,不存在:" + _uid ); return false; } // 对象删除 // nx.logger.debug( "[对象工厂]删除对象:", _uid, object.__classname__ || object._jsfile ); if( nx.dt.fnGood( object.uninitialize ) ) { object.uninitialize(); } delete this.instances[ _uid ]; return true; } } ); module.exports = NxFactory;