概念:工厂模式的定义:提供创建对象的接口,意思就是根据领导(调用者)的指示(参数),生产相应的产品(对象)。
创建一个对象常常需要复杂的过程,所以不适合在一个复杂的对象中。
创建对象可能会导致大量的重复代码,也可能提供不了足够级别的抽象。
工厂就是把成员对象的创建工作转交给一个外部对象,好处在于消除对象之间的耦合(也就是相互影响)
分类:
简单工厂模式:使用一个类,通常为单体,来生成实例。
复杂工厂模式定义是:将其成员对象的实列化推到子类中,子类可以重写父类接口方法以便创建的时候指定自己的对象类型。
父类只对创建过程中的一般性问题进行处理,这些处理会被子类继承,子类之间是相互独立的,具体的业务逻辑会放在子类中进行编写。
代码实现:
简单工厂模式:
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)需要依赖具体环境创建不同实例
(3)处理大量具有相同属性的小对象
优点:
可以实现一些相同的方法,这些相同的方法我们可以放在父类中编写代码,那么需要实现具体的业务逻辑,那么可以放在子类中重写该父类的方法,去实现自己的业务逻辑;
也就是说有两点:
1、弱化对象间的耦合,防止代码的重复。在一个方法中进行类的实例化,可以消除重复性的代码。
2、重复性的代码可以放在父类去编写,子类继承于父类的所有成员属性和方法,子类只专注于实现自己的业务逻辑。
缺点:
当工厂增加到一定程度的时候,提升了代码的复杂度,可读性下降。而且没有解决对象的识别问题,即怎么知道一个对象的类型。
Atas ialah kandungan terperinci javascript设计模式之工厂模式的定义、分类、用法实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!