抽象工厂模式:通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。
//测试抽象类,使用其实例方法时会抛出错误
var test = function(){};
test.prototype = {getFirst:function(){return new Error('抽象方法不可调用');},getSecond:function(){return new Error('抽象方法不可调用!');}
};
在上面的代码中,test类什么都不能做,创建时没有任何属性,原型上的方法也不能使用。但是在继承上是很有用的,因为定义了一种类,并定义了其方法,如果在子类中重写其方法,就不会出现报错。
但是如果必要的方法从父类中继承过来而没有去具体去重写实现,那么实例化对象会调用父类中的方法。如果父类中有提示的话,是非常有帮助的。这就是抽象类的作用所在。
var myTest = function(subType,superType){//判断抽象工厂中是否有该抽象类if(typeof myTest[superType] === 'function'){//缓存类function F(){};//继承父类的方法和属性F.prototype = new myTest[superType]();//将子类constructor指向子类subType.constructor = subType;//子类原型继承“父类”subType.prototype = new F();}else{//不存在该抽象类抛出错误throw new Error("未创建抽象类!!!");}
}
myTest.first = function(){this.type = 'first';};myTest.first.prototype = {getFirst:function(){return new Error('抽象方法不可调用');},getSecond:function(){return new Error('抽象方法不可调用!');}};myTest.second = function(){this.type = 'second';};myTest.second.prototype = {getFirst:function(){return new Error('抽象方法不可调用');},getSecond:function(){return new Error('抽象方法不可调用!');}};
抽象工厂其实是一个实现子类继承父类的方法,在这个方法中要通过传递子类以及要继承父类(抽象类)的名称,并在抽象工厂方法中又增加了一次对抽象类存在性的一次判断,如果存在,就会继承父类的方法。
注意:在对过渡类的原型继承时,不是继承父类的原型,而是通过new关键字复制父类的一个实例。因为不仅仅要继承父类的原型方法,更要继承父类的对象属性。
抽象工厂模式满足什么原则、一个测试用例,展示继承的使用
//第一个测试子类var firstTest = function(firstParameter,secondParameter){this.firstParameter = firstParameter;this.secondParameter = secondParameter;};//抽象工厂实现对test抽象类的继承myTest(firstTest,'test');firstTest.prototype.getFirst = function(){return this.firstParameter;}firstTest.prototype.getSecond = function(){return this.secondParameter;}
抽象工厂模式是设计模式中最抽象的一个,也是唯一一种抽象化创建模式。创建出来的不是一个真正的对象实例,而是一个类簇,它制定了类的结构,区别于简单工厂模式创建单一对象,工厂方法模式创建多类对象。由于Javascript不支持抽象化创建与虚拟方法,应用不太广泛。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态