Files

155 lines
4.0 KiB
JavaScript
Raw Permalink Normal View History

2026-05-23 22:10:14 +08:00
/*******************************************************************************
*
* 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;