js设计模式--工厂模式
工厂模式:
工厂模式的目的是为了创建对象,它经常是在类和类的方法中实现。简单的工厂模式是由一个方法来决定到底要创建哪类的实例,这些实例经常拥有相同的接口,这种模式在所实例化的类型在编译期并不确定,而是在执行期决定的情况。
比如说,你有一家加工厂,生产各类牛奶:三氯氰胺奶粉,酸奶,变质奶,。。等等。当有客户跟你签约生产某种奶粉的时候,你便让工厂生产对应的奶。但如果要求生产牛肉,那肯定没有这个功能。。。
具体上代码:
var Car = (function () {
var Car = function (model, year, miles) {
this.model = model;
this.year = year;
this.miles = miles;
};
return function (model, year, miles) {
return new Car(model, year, miles);
};
})();
var tom = new Car("Tom", 2009, 20000);
var dudu = new Car("Dudu", 2010, 5000);
初始化Car已经自执行,返回值是一个匿名函数,当用new创建实例时,返回的是内部Car的实例。所以当传进去不同数值是返回来的就是不同的实例。
让我们看下面一个工厂模式,在页面中插入不同的一些元素,这些元素类型是不固定的,它具备一个工行类和子类型,具体上代码:
//建立一个总的工厂类
var copyFactory = copyFactory || {};
copyFactory.dom = copyFactory.dom || {}; //处理文本函数
copyFactory.dom.text = function(){
this.insert = function(where){
var txt = document.createTextNode(this.url);
where.appendChild(txt);
};
};
//处理链接函数
copyFactory.dom.link = function(){
this.insert = function(where){
var link = document.createElement('a');
link.href = this.url;
link.appendChild(document.createTextNode(this.url));
where.appendChild(link);
};
};
创建了一个copyFactory.dom这个对象,在其上面添加静态的方法text,link。
创建工厂处理函数:
//定义工厂处理函数
copyFactory.dom.factory = function(type){
var con = type,newFac;
//如果copyFactory.dom这个类不存在con这个静态函数就报错,存在返回它的实例
if(typeof copyFactory.dom[con] != 'function'){
throw{
name:"error",
message:con+"不存在!"
}
}else{
return new copyFactory.dom[con];
}
};
使用方法如下:
//实例化一个处理链接的函数
var link = copyFactory.dom.factory("link");
//可以使用方法了;
link.url ="http://www.baidu.com";
link.insert("body"); //实例化一个处理文本的函数
var text = copyFactory.dom.factory("text");
//可以使用方法了;
link.text ="创建文本";
搞定。
其实全局的Object()函数也表现出来工厂的行为,输入不同类型的而创建不同的对象。
比如你输入的是一个number = 1,那么后台就会以Number()构造函数创建对象:
//无论是否用new,都会调用Object();
var num = Object(1);
var num2 = new Object(1); num.constructor === Number; //true
num2.constructor === Number; //true
字符串,布尔值也成立:
var str = Object("1");
str.constructor === String; //true
var bl = Object(true);
bl.constructor === Boolean; //true
汤姆大叔语:
什么时候使用工厂模式
以下几种情景下工厂模式特别有用:
- 对象的构建十分复杂
- 需要依赖具体环境创建不同实例
- 处理大量具有相同属性的小对象
什么时候不该用工厂模式
不滥用运用工厂模式,有时候仅仅只是给代码增加了不必要的复杂度,同时使得测试难以运行下去。
虽然现在还没用到这样的模式写程序,但明白其中的原理,在套用已有的代码看很清晰。
参考《javascript模式》
汤姆大叔博客:http://www.cnblogs.com/TomXu/archive/2012/02/23/2353389.html
推荐阅读:
http://www.hulufei.com/post/201008141553
http://www.alloyteam.com/2012/10/commonly-javascript-design-patterns-simple-factory-pattern/
js设计模式--工厂模式的更多相关文章
- JS设计模式——工厂模式详解
它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常 ...
- js设计模式-工厂模式(抽象工厂)
场景:定义一个抽象类 AbsProducer(生产商),该生产商有两个行为,一个生产,一个出售,其中生产方法为抽象方法,由具体的厂家(工厂)去实现,出售的产品均是电子产品(返回的对象为电子产品对象,即 ...
- [js]js设计模式-工厂模式
// 定义一个人 var p1 = { name: 'wxb', age: 22, writejs: function () { console.log(this.name + ' can sing. ...
- js设计模式-工厂模式(XHR工厂)
场景:如果代码中需要多次执行Ajax请求,那么明智的做法是把创建这种对象的代码提取到一个类中,并创建一个包装器来包装在实际请求时所要经历的一系列步骤.简单工厂非常适合这种场合. /*AjaxHandl ...
- .NET设计模式: 工厂模式
.NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html .NET设计模式(1): ...
- JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法)
JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法) 一丶正则的用法 创建正则对象: 方式一: var reg=new ...
- 【设计模式】Java设计模式 -工厂模式
[设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...
- JS 简单工厂模式,工厂模式(二)
一.什么是工厂模式: 工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂.那么,在实际项目中,我们是不是可以 ...
- [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
随机推荐
- 【转】14个最佳的HTML/CSS设计和开发框架
专业的网页设计是既复杂又耗时的.它需要HTML和CSS框架的完美结合.这些框架不仅可以为设计方案增加特定的功能,还可以大大地节省时间和精力. 高效的框架不仅是网站设计的基础,它提供的各种丰富多彩的功能 ...
- IOS开发-UI学习-sqlite数据库的操作
IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...
- 【转】Linux目录下/dev/shm的理解和使用
一般来说,现场部署 都要根据内存的大小来设定/dev/shm的大小,大部分使用的是默认的值! Linux目录下/dev/shm的理解和使用 [日期:2014-05-16] 来源:Linux社区 作 ...
- android开发学习——day3
关于android开发的详细过程了解 Android App程序的四种重要组成类型:1.Activity 2.Service 3.Content Provider 4.Broadcast Receiv ...
- linux设置好IP后,可以访问内网,不能访问外网
1,设置网卡,ip vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为et ...
- Bagging和Boosting 概念及区别
Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法.即将弱分类器组装成强分类器的方法. 首先介绍Boot ...
- Android与Linux以及GNU的关系
转帖自 http://www.eefocus.com/Kevin/blog/09-11/179409_1dc9a.html 作者: Kevin 本文转贴自 http://mmdays.com/2008 ...
- Storm学习笔记六
1 Storm的通信机制 说明:1.worker与worker之间跨进程通信: 2.worker内部中各个executor间的通信,Task对象--->输入队列queue--->执行--- ...
- 电商网站垮IDC数据备份,MySql主从同步,图片及其它数据文件的同步
原文网址:http://www.bzfshop.net/article/180.html 对一个电子商务网站而言,最宝贵的资源就是数据.服务器是很廉价的东西,即使烧了好几个也问题不大,但是用户数据如果 ...
- java_web学习(8)会话与状态管
HTTP简介 WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议.HTTP是hypertext transfer protocol(超文本传输协 ...