本篇介绍OOP的第二个对象factory。在以往项目中其实真正使用klass的地方相当少,而factory则是十分常见的。
在smartjs中的factory并不是指的是工厂模式。在factory要求定义一个基础对象,这个对象可以是基类,也可以是模板对象或者是接口。然后factory就已此基础对象为基础,其他添加或者创建的对象,继承或者是复制基础对象的属性和方法。factory在提供一系列方法来对这些对象做控制。
factory经过简单的处理可以实现工厂、外观、模板等设计模式。
接口说明
//多参数接口 st.factory(name, base, proto, type, initDefault) //参数对象接口 st.factory({ //工厂名 name : "", //基类对象 base : {}, //工厂的扩展属性和方法对象 proto:{}, //工厂的类型;默认:类实例化后的对象;class:类对象,未实例化;merge:对象复制合并 type : "", //是否将base设置成为默认的对象;当使用factory.get找不到对象时返回默认对象 initDefault:true }) //创建工厂后的接口说明 //创建产品方法,但不注册到factory中去,name:产品名称;item:产品特性;parent:父类名称 factory.build(name, item, parent) //添加产品方法,会注册到factory中去,name:产品名称;item:产品特性;parent:父类名称 factory.add(name, item, parent) //查找产品方法,name:产品名称;defaultMode:是否在找不到产品的时候返回默认对象 factory.find(name, defaultMode) //删除产品方法,name:产品名称 factory.remove(name) //设置默认产品方法,name:产品名称 factory.setDefault(name) //执行所有产品的某个方法,fnName:产品的方法名称;args:参数数组 factory.fire(fnName,args)
实例代码
//widget基类 var baseWidget = { //widget类型 type: '', //widget的渲染方法 render: function(id) { return this.type + ':' + id; } }; //一个widget工厂 var widgetFactory = st.factory('wdigetfactory', baseWidget); //添加一个input widgetFactory.add('input', { type: 'input' }) it("factory add", function() { //找到添加的input var input = widgetFactory.find('input'); expect(input).toBeDefined(); //输出 expect(input.render('txt')).toBe("input:txt"); }); it("factory inheirt", function() { //添加一个number类型的input var num = widgetFactory.add('number', { type: 'input[number]' }, 'input') expect(num.render('txtNum')).toBe("input[number]:txtNum"); });
class模式
var f1 = st.factory({ name: 'classMode', //设置class类型 type: 'class', base: { klassInit: function(name) { this.name = name; } } }); var c1 = f1.add('c1', { type: 'c1' }); expect(c1.fn).toBeDefined(); //需要初始化 var c = new c1('class1'); expect(c.type).toBe("c1"); expect(c.name).toBe("class1");
merge
var f2 = st.factory({ name: 'copyMode', //设置merge类型 type: 'merge', //设置默认模式 initDefault: true, base: { name: 'copy', project: { name: 'smartjs' } } }) var c = f2.add('c1', { name: 'c1', project: { role: 'pm' } }); expect(f2.find().name).toBe("copy"); expect(c.name).toBe("c1"); expect(c.project.name).toBe("smartjs"); expect(c.project.role).toBe("pm");
factory的使用方式还有很多,暂时就不多做介绍了,有机会专门找个专题来介绍具体的使用案列。另外在smartjs后续的内容中,也会大量使用factory。
smartjs 下一版预告,会加入smartjs核心的重要模块:基于策略的数据管理
分类:
Smartjs
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?