再起航,我的学习笔记之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设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。
欢迎转载,转载请注明作者,原文出处。
- 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)
- 再起航,我的学习笔记之JavaScript设计模式12(适配器模式)
- 再起航,我的学习笔记之JavaScript设计模式15(组合模式)
- 再起航,我的学习笔记之JavaScript设计模式15(组合模式)
- 再起航,我的学习笔记之JavaScript设计模式16(享元模式)
- 再起航,我的学习笔记之JavaScript设计模式17(模板方法模式)
- 再起航,我的学习笔记之JavaScript设计模式18(观察者模式)
- 再起航,我的学习笔记之JavaScript设计模式20(策略模式)
- 再起航,我的学习笔记之JavaScript设计模式25(迭代器模式)
- 再起航,我的学习笔记之JavaScript设计模式26(解释器模式)
- 设计模式学习笔记之抽象工厂设计模式
- 设计模式之--抽象工厂模式(学习分析笔记)
- Java学习笔记---设计模式之抽象工厂模式
- 设计模式学习笔记-抽象工厂模式
- 设计模式学习笔记--抽象工厂模式
- 设计模式学习笔记-抽象工厂模式
- 设计模式笔记之---抽象工厂模式
- 《设计模式》笔记之抽象工厂模式
- 距离和相似性度量方法
- [平衡树]Treap实现Rank Tree
- ReactNative_布局
- Oracle小记 ---- 表空间导致的系统重装170815
- 2017.8.15总结1-平台
- 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)
- 国泰新点部分面试题整理
- 肢体语言识别系统OpenPose问世,它甚至能明白你的表情
- centos上安装nodejs和npm的步骤详解
- 四、c++中的算法--变动性算法---转换
- Django学习(三)——MVC架构
- Oracle12C--复合触发器(五十五)
- 四、c++中的算法--变动性算法---互换
- 8.15 完美交换 2699