工厂模式是管理对象的一种设计模式,通过向外提供一个公共方法用于创建对象。把使用对象的部分与创建对象的部分分离,创建对象部分与对象创建前的初始化分离,职责分离。jQuery.Callbacks是一个工厂,每次调用都会返回一个对象,并且根据传入的不同参数值返回的对象具有不同的特征。
1.简单工厂模式
在工厂方法中,根据传入的参数创建相应的对象,并且返回。
function Orange(){ this.color = 'orange'; } function Apple(){ this.color = 'red'; } function Banana(){ this.color = 'yellow'; } // 创建对象的工厂 function SimpleFactory(type){ var fruit = null; switch(type){ case 'orange': fruit = new Orange(); break; case 'apple': fruit = new Apple(); break; case 'banana': fruit = new Banana(); } return fruit; } //测试 var apple = SimpleFactory('apple'); console.log(apple.color); var banana = SimpleFactory('banana'); console.log(banana.color);
简单工厂模式只能产生工厂方法中指定类型的对象,当需要添加其他类型的对象时,需要在工厂方法中添加相对应的代码。
2.工厂模式
工厂模式对简单工厂模式改进,可以扩展新的类型的对象,并且不用修改工厂方法。
function Fruit(){} Fruit.prototype.say = function(){ return 'hello,my name is ' + this.name; } Fruit.Apple = function (){ this.name = 'apple'; } Fruit.Banana = function(){ this.name = 'banana'; } Fruit.Orange = function(){ this.name = 'orange'; } Fruit.factory = function(type){ var fruit = null; //如果构造函数不存在,返回 if(typeof Fruit[type] !== 'function'){ return; } //使用原型继承父类 if(typeof Fruit[type].prototype.getColor !== 'function'){ Fruit[type].prototype = new Fruit(); } //创建对象 fruit = new Fruit[type](); return fruit; } //测试 var apple = Fruit.factory("Apple"); console.log(apple.say());