1、工厂模式:
虽然Object构造函数和对象字面量都可以用来创建单个对象,但这个方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复的代码。为了解决这个问题,开始使用工厂模式。
利用工厂模式,可以实现不指定特定的类而创建出对象,也就是说,不需要使用new关键字来创建特定类或子类的实例。
var TravelTeam = function(){};
TravelTeam.prototype = {
register : function(model){
var person;
switch(type){
case "student":
person = new Student();
break;
case "teacher":
person = new Teacher();
break;
default:
person = new Doctor();
break;
}
return person;
}
}
var team = new TravelTeam();
team.register(student");
问题:大多数情形下使用没有问题,但扩展性不好,如需要添加一些新的队员类型,必须修改switch部分。
解决:工厂模式,把相同的部分单独出来交给一个简单的工厂对象:
var TeamFactory = {
createTeam:function(type){
var person;
switch(type){
case "student":
person = new Student();
break;
case "teacher":
person = new Teacher();
break;
default:
person = new Doctor();
break;
}
return person;
}
}
TeamFactory是一个脱离于TravelTeam的单体,能降低耦合度,当需要添加一些新的队员类型的时候,只要修改TeamFactory工厂单体对象就行。
var TravelTeam = function(){};
TravelTeam.prototype = {
register:function(type){
var person = TeamFactory.createTeam(type);
return person;
}
}
工厂模式的问题:虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即不知道对象的类型)。
解决:构造器模式,请见:http://blog.csdn.net/zhouziyu2011/article/details/68952310。
2、抽象工厂模式
在工厂模式的基础上进行更高层次的抽象,根据共同的用途或主题来抽象出一个最高层基础工厂类,其他具有相似行为的工厂类将继承于此工厂类。
最典型的例子是了解HTML5与HTML4表单域的不同之处后,抽象出最高层的表单域工厂类,HTML5表单域工厂类和HTML4表单域工厂类都继承自该类。
工厂模式与抽象工厂模式的不同:
① 当需要在代码的其余所有部分通过屏蔽较为复杂的对象创建方法来简化某些特定对象的创建过程时,使用工厂模式很适合;
② 当需要从现有代码中的多个类中,根据这些类之间共有的目的或通用的主题,创建出一个额外的抽象层,以降低应用程序的其余开发工作的复杂性时,使用抽象工厂模式很适合。