概念:工厂模式的定义:提供创建对象的接口,意思就是根据领导(调用者)的指示(参数),生产相应的产品(对象)。
创建一个对象常常需要复杂的过程,所以不适合在一个复杂的对象中。
创建对象可能会导致大量的重复代码,也可能提供不了足够级别的抽象。
工厂就是把成员对象的创建工作转交给一个外部对象,好处在于消除对象之间的耦合(也就是相互影响)
分类:
立即学习“Java免费学习笔记(深入)”;
简单工厂模式:使用一个类,通常为单体,来生成实例。
复杂工厂模式定义是:将其成员对象的实列化推到子类中,子类可以重写父类接口方法以便创建的时候指定自己的对象类型。
父类只对创建过程中的一般性问题进行处理,这些处理会被子类继承,子类之间是相互独立的,具体的业务逻辑会放在子类中进行编写。
代码实现:
简单工厂模式:
var XMLHttpFactory =function(){}; //这是一个简单工厂模式
XMLHttpFactory.createXMLHttp =function(){
var XMLHttp = null;
if (window.XMLHttpRequest){
XMLHttp = new XMLHttpRequest()
}else if (window.ActiveXObject){
XMLHttp = new ActiveXObject("Microsoft.XMLHTTP")
}
return XMLHttp;
}
//XMLHttpFactory.createXMLHttp()这个方法根据当前环境的具体情况返回一个XHR对象。
var AjaxHander =function(){
var XMLHttp = XMLHttpFactory.createXMLHttp();
...
}复杂工厂模式:流程==》 先设计一个抽象类,这个类不能被实例化,只能用来派生子类,最后通过对子类的扩展实现工厂方法
var XMLHttpFactory =function(){}; //这是一个抽象工厂模式
XMLHttpFactory.prototype = {
//如果真的要调用这个方法会抛出一个错误,它不能被实例化,只能用来派生子类
createFactory:function(){
throw new Error('This is an abstract class');
}
}
var XHRHandler =function(){}; //定义一个子类
// 子类继承父类原型方法
extend( XHRHandler , XMLHttpFactory );
XHRHandler.prototype =new XMLHttpFactory(); //把超类原型引用传递给子类,实现继承
XHRHandler.prototype.constructor = XHRHandler; //重置子类原型的构造器为子类自身
//重新定义createFactory 方法
XHRHandler.prototype.createFactory =function(){
var XMLHttp =null;
if (window.XMLHttpRequest){
XMLHttp =new XMLHttpRequest();
}else if (window.ActiveXObject){
XMLHttp =new ActiveXObject("Microsoft.XMLHTTP")
}
return XMLHttp;
}应用场景:
系统包含模块:1、卖场系统适用客户:实体卖场,可以分类管理,每个分类设置一个客服,客服可以使用手机管理分类商品2、万能表单用户可以自定义表单字段,收集各样信息,并可以导出Excel3、第三方接口方便用户自己开发,目前仅支持text格式4、留言板可以显示用户的头像和昵称5、场景二维码这是高级接口的使用,方便统计用户来源6、一键分享一个仿微信公众号详情界面,可以分享到朋友圈7、婚纱摄影一个相册+店面展
以下几种情景下工厂模式特别有用:
(1)对象的构建十分复杂
(2)需要依赖具体环境创建不同实例
(3)处理大量具有相同属性的小对象
优点:
可以实现一些相同的方法,这些相同的方法我们可以放在父类中编写代码,那么需要实现具体的业务逻辑,那么可以放在子类中重写该父类的方法,去实现自己的业务逻辑;
也就是说有两点:
1、弱化对象间的耦合,防止代码的重复。在一个方法中进行类的实例化,可以消除重复性的代码。
2、重复性的代码可以放在父类去编写,子类继承于父类的所有成员属性和方法,子类只专注于实现自己的业务逻辑。
缺点:
当工厂增加到一定程度的时候,提升了代码的复杂度,可读性下降。而且没有解决对象的识别问题,即怎么知道一个对象的类型。










