工厂模式:

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

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

 具体上代码:

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. CoordinatorLayout学习笔记

    CoordinatorLayout是一个增强型的FrameLayout.它的作用有两个 作为一个布局的根布局 最为一个为子视图之间相互协调手势效果的一个协调布局 代码如下: <?xml vers ...

  2. mysql 省市联动sql 语句

    /*MySQL Data TransferSource Host: localhostSource Database: virgoTarget Host: localhostTarget Databa ...

  3. eclipse 如何debug jdk源码(转)

    转:http://blog.csdn.net/cherrycheng_/article/details/51004386 原英文地址:http://stackoverflow.com/question ...

  4. js 回车触发事件

    <script type="text/javascript" language=JavaScript > document.onkeydown=function(eve ...

  5. UVa 11790 - Murcia's Skyline

    题目大意:给一个建筑的序列,建筑用高度和宽度描述,找出按高度的LIS和LDS,最长XX子序列的长度按照序列中建筑的宽度和进行计算. 其实就是带权的最长XX子序列问题,原来是按个数计算,每个数权都是1, ...

  6. UVa 11308 - Bankrupt Baker

    题目大意:给出一些原料和价钱和若干份菜谱,每份菜谱都标明所需的原料和数量,找出所有不超过预算的菜谱. 没什么好说的,主要是对map的运用. #include <cstdio> #inclu ...

  7. oracle关键字(保留字)

    其实这个东西可以在oracle 上输入一个sql语句就可以得到: select * from v$reserved_words order by keyword asc;   //order 后边不是 ...

  8. Win10還原成最乾淨的狀態 不必重灌

    系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...

  9. 用js给html控件赋值

      用js给html控件赋值 <script> window.onload=function setValue()//在页面加载时赋值 { document.getElementById( ...

  10. Jenkins搭建Windows slave 环境

      因为之前的接口测试平台是在windows上,后来换了linux,花了半天时间也没有成功,就想着建立一个windows的节点曲线救国   创建WindowsSlave 首先要保证windows和sl ...