smartjs 0.2 OOP講解 - factory

本篇介紹OOP的第二個對象factory。在以往項目中其實真正使用klass的地方至關少,而factory則是十分常見的。設計模式

在smartjs中的factory並非指的是工廠模式。在factory要求定義一個基礎對象,這個對象能夠是基類,也能夠是模板對象或者是接口。而後factory就已此基礎對象爲基礎,其餘添加或者建立的對象,繼承或者是複製基礎對象的屬性和方法。factory在提供一系列方法來對這些對象作控制。數組

factory通過簡單的處理能夠實現工廠、外觀、模板等設計模式。ui

接口說明

//多參數接口
        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模式this

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");

 

mergespa

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核心的重要模塊:基於策略的數據管理code

相關文章
相關標籤/搜索