155 lines
4.0 KiB
JavaScript
155 lines
4.0 KiB
JavaScript
|
|
/*******************************************************************************
|
||
|
|
*
|
||
|
|
* 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;
|