工厂模式:

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

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

 具体上代码:

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. Android学习笔记--处理UI事件

    Handling UI Events 在Android里, 有不只一种方式可以截获用户与你的应用程序交互的事件. 在你的界面上处理事件时,你需要捕获用户与某个View实例交互时所产生的事件.View类 ...

  2. SPOJ839 OPTM - Optimal Marks

    传送门 闵神讲网络流应用的例题,来水一水 要写出这道题,需要深入理解两个概念,异或和最小割. 异或具有相对独立性,所以我们把每一位拆开来看,即做大概$32$次最小割.然后累加即可. 然后是最小割把一张 ...

  3. iOS开发~CocoaPods使用详细说明 分类: ios相关 2015-04-01 16:45 68人阅读 评论(0) 收藏

    iOS开发-CocoaPods使用详细说明 一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来 ...

  4. 编译Uboot时提示error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

    在Ubuntu14.04 64位系统中已经安装了libc6:i386的库,编译Uboot时提示error while loading shared libraries: libz.so.1: cann ...

  5. 安卓主activity引用自定义的View——Android LayoutInflater原理分析

    相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用于加载布局的.而刚接触Android的朋友可能对LayoutInflater不怎么熟悉,因为加载布局的 ...

  6. [Angular Tutorial] 11 -Custom Filters

    在这一步中您将学到如何创建您自己的展示过滤器. ·在先前的步骤中,细节页面展示“true”或“false”来显示某部电话是否有某项功能.在这一步中,我们将使用自定义的过滤器来将这些个字符串转化成符号: ...

  7. 9.TCP:传输控制协议

    1.TCP功能     TCP向应用层提供面向连接的.可靠的字节流服务.TCP可以认为是一个没有选择确认或否认的滑动窗口协议.     TCP将用户数据打包构成报文段:它发送数据后启动一个定时器:另一 ...

  8. iOS 之 定时器

    [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(showMyDrivingRangeTimer) ...

  9. LNAMP 中的PHP探针

    <?php /* ----------------本探针基于YaHei.net探针------------------- */ error_reporting(0); //抑制所有错误信息 @h ...

  10. mysql调优 参数说明

    原文地址:http://wenku.baidu.com/view/49087bbafd0a79563c1e72c8.html 关键字: mysql *1, 查看 MySQL 服务器配置信息 *1. m ...