工厂模式:

工厂模式的目的是为了创建对象,它经常是在类和类的方法中实现。简单的工厂模式是由一个方法来决定到底要创建哪类的实例,这些实例经常拥有相同的接口,这种模式在所实例化的类型在编译期并不确定,而是在执行期决定的情况。

 比如说,你有一家加工厂,生产各类牛奶:三氯氰胺奶粉,酸奶,变质奶,。。等等。当有客户跟你签约生产某种奶粉的时候,你便让工厂生产对应的奶。但如果要求生产牛肉,那肯定没有这个功能。。。

 具体上代码:

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

汤姆大叔语: 

      什么时候使用工厂模式

        以下几种情景下工厂模式特别有用:

      1. 对象的构建十分复杂
      2. 需要依赖具体环境创建不同实例
      3. 处理大量具有相同属性的小对象

      什么时候不该用工厂模式

        不滥用运用工厂模式,有时候仅仅只是给代码增加了不必要的复杂度,同时使得测试难以运行下去。

虽然现在还没用到这样的模式写程序,但明白其中的原理,在套用已有的代码看很清晰。

参考《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设计模式--工厂模式的更多相关文章

  1. JS设计模式——工厂模式详解

    它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常 ...

  2. js设计模式-工厂模式(抽象工厂)

    场景:定义一个抽象类 AbsProducer(生产商),该生产商有两个行为,一个生产,一个出售,其中生产方法为抽象方法,由具体的厂家(工厂)去实现,出售的产品均是电子产品(返回的对象为电子产品对象,即 ...

  3. [js]js设计模式-工厂模式

    // 定义一个人 var p1 = { name: 'wxb', age: 22, writejs: function () { console.log(this.name + ' can sing. ...

  4. js设计模式-工厂模式(XHR工厂)

    场景:如果代码中需要多次执行Ajax请求,那么明智的做法是把创建这种对象的代码提取到一个类中,并创建一个包装器来包装在实际请求时所要经历的一系列步骤.简单工厂非常适合这种场合. /*AjaxHandl ...

  5. .NET设计模式: 工厂模式

    .NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html   .NET设计模式(1): ...

  6. JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法)

    JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法) 一丶正则的用法 创建正则对象: 方式一: var reg=new ...

  7. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...

  8. JS 简单工厂模式,工厂模式(二)

    一.什么是工厂模式: 工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂.那么,在实际项目中,我们是不是可以 ...

  9. [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

随机推荐

  1. 02 easyui -parser

    parser: 页面节点class=“easyui-” +组件名(在plugins里) ,则可以 渲染成相应的组件.

  2. Java Dwr3实现消息推送步骤详解

    DWR包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改 ...

  3. iOS中UITextField 使用全面解析 分类: ios技术 2015-04-10 14:37 153人阅读 评论(0) 收藏

    //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...

  4. 【Xilinx-Petalinux学习】-01-开发环境搭建与PetaLinux的安装

    开发环境 VMware12, Ubuntu 16.04 64 bit 在VMware中安装Ubuntu,用户名:xilinx-arm 密码:root step1: VMware Tools问题 不知道 ...

  5. TSP问题 遗传算法 智能优化算法

    写了半天,效率还是有点低的,以后有空再优化下: //用次序表示法来表示个体编码 #include<iostream> #include<fstream> #include< ...

  6. linux在线预览pdf文件开发思路

    准备:swftools,flexpaper 基本思路: 1,将pdf文件转化成swf文件 2,使用flexpaper预览swf文件 主要代码: 1,在linux中安装swftools.官网下载swft ...

  7. javascript中的元素包含判断

    在实际开发中,很多时候需要知道某个节点是不是另一个节点的后代.很多浏览器提供了contains方法,如: console.log(document.documentElement.contains(d ...

  8. 负载均衡探测器lbd

    负载均衡探测器lbd   大型网站为了解决海量访问问题,往往采用负载均衡技术,将用户的访问分配到不同的服务器上.网站的负载均衡可以从DNS和HTTP两个环节进行实施.在进行Web渗透测试的时候,需要先 ...

  9. GOLang(第二篇 发起一个Http请求)

    import ( "net/http" "net/url" ) //发送一个简单的get请求 func GetRequest { //联系使用 make(map ...

  10. Angular - - $rootScope.Scope

    这里讲的是一些scope的操作,如创建/注销/各种监听及scope间的通信等等. $rootScope.Scope 可以使用$injector通过$rootScope关键字检索的一个根作用域. 可以通 ...