再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)

来源:互联网 发布:电塔升级数据 编辑:程序博客网 时间:2024/03/29 15:50

我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧!

前两次我们分享了简单工厂模式,和工厂方法模式,这一次我们接着来分享抽象工厂模式

抽象工厂模式

抽象工厂模式(Abstract Factory): 通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。

在了解抽象工厂模式前,我们要先了解一下如何在JavaScript中实现抽象类。

我们知道JavaScript中没有abstract所以我们无法像传统的面向对象语言一样轻松的创建一个抽象类,但是我们可以在类的方法中手动地抛出错误来模拟抽象类。

abstract修饰符可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员,抽象方法是没有方法体的方法。

我们创建一个学生抽象类,当直接使用其实例对象的方法时,我们让其抛出错误 。

var Students=function(){};Students.prototype={    getName:function(){        throw new Error('抽象方法不能被调用');    },    getCourse:function(){        throw new Error('抽象方法不能被调用');    }    };

这样我们就创建了一个抽象类,那么抽象类有什么作用呢?

我们现在创建的这个Students类其实什么都不能做,但是在继承上很有用,因为我们定义了一种类型,并定义了该类型所必备的方法,如果子类中没有重写这些方法,那么在调用的时候便会报错。
针对抽象类我们也有一套相关的模式,这个模式就是我们今天要介绍的抽象工厂模式。
抽象工厂模式,在javascript中一般不用来创建具体对象,我们一般用它作为父类来创建子类。
抽象工厂方法

var AbstractFactory=function(ParentType,ChildType){    //判断抽象工厂中是否有该抽象类    if(typeof AbstractFactory[ParentType]==='function'){        //缓存类        function CacheClass(){};        //继承父类属性和方法        CacheClass.prototype=new AbstractFactory[ParentType]();        //将子类的constructor指向子类        ChildType.constructor=ChildType;        //子类原型继承父类        ChildType.prototype=new CacheClass();    }else{        //如果不存在这个抽象方法我们就抛出错误        throw new Error('未创建该抽象类');    }};

接着我们添加抽象属性

AbstractFactory.Students=function(){    this.type="Students";};AbstractFactory.Students.prototype={        getName:function(){        throw new Error('抽象方法不能被调用');    },    getCourse:function(){        throw new Error('抽象方法不能被调用');    }    };

我们可以看到,抽象工厂其实就是一个实现子类继承父类的方法,在这个方法中五门需要通过传递子类以及要继承的父类的名称,并且在抽象工厂方法中又增加了一次对抽象类存在性的一次判断,如果存在我们就通过寄生式继承继承父类,如果不存在我们就抛出异常。

我们对抽象工厂添加抽象类也很特殊,因为抽象工厂是个方法,不需要实例化对象,所以我们只需为抽象工厂添加类的属性即可。

讲完了创建,我们接着来讲如何使用它们。
我们先创建一个学生子类

var Primary=function(name,course){    this.name=name;    this.course=course;}

接着我们通过抽象工厂实现对Students抽象类的继承

AbstractFactory("Students",Primary);Primary.prototype.getName=function(){    return this.name;}Primary.prototype.getCourse=function(){    return this.course;}

最后我们试着调用一下

var student=new Primary("张三","数学");console.log(student.getName());//张三console.log(student.getCourse());//数学console.log(student.type);//Students

抽象工厂模式是设计模式中最抽象的一种,也是创建模式中唯一一种抽象化创建模式,该模式创建出的结果不是一个真实的对象实例,而是一个类簇,它制定了类的结构,这也就和我们之前介绍的简单工厂模式创建单一对象,工厂方法模式创建多类对象有了区别,但是由于JavaScript中不支持抽象化创建和虚方法,所以这种模式不能像其他面向对象语言中应用的那么广泛。

也谢谢大家看到这里:)如果你觉得我的分享还可以请点击推荐,分享给你的朋友让我们一起进步~

好了以上就是本次分享的全部内容,本次示例参考自JavaScript设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

欢迎转载,转载请注明作者,原文出处。

阅读全文
0 0