首页 > 代码库 > smartjs 0.2 OOP讲解 - factory

smartjs 0.2 OOP讲解 - factory

本篇介绍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.create(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核心的重要模块:基于策略的数据管理