惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog

博客园 - Roy Zhang

让文档和Demo生成更加简单和强大 - SmartDoc 0.1.1 说明 SmartDoc(YUIDoc) 注释编写 JS文档和Demo自动化生成工具 - SmartDoc发布 smartjs - DataManager 场景示例分析 - 数据懒加载 smartjs - DataManager API smartjs 0.3 DataManager 发布&介绍 SmartJS 系列规划分享和背景介绍 smartjs 0.2 OOP讲解 - Klass 类继承 smartjs 0.2发布 - 新增oop模块&AOP增强 smartJS 0.1 API 讲解 - FlowController smartJS 0.1 API 讲解 - Trigger smartJS 0.1 API 讲解 - PromiseEvent SmartJS 第一期(0.1)发布 - AOP三剑客 SmartUI2.0后续声明 JQuery SmartUI 2.0 方案启动 JQuery Smart UI 开发规范&API文档发布 JQuery Smart UI与Moss结合演示 JQuery Smart UI 快捷开发实例应用(二)— 开发模式【从项目开发流程说起】 告别aspx,高性能快捷开发 — JQuery Smart UI 快捷开发实例应用(一)入门【后篇】
smartjs 0.2 OOP讲解 - factory
Roy Zhang · 2014-06-15 · via 博客园 - Roy Zhang

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