zoukankan      html  css  js  c++  java
  • 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计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设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

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

  • 相关阅读:
    NC 5的开发环境起不了客户端
    NC 6系初始化EJB
    ubuntu安装javaweb
    html 优化
    ubuntu
    jquery
    前端优化
    京东设计中心
    html cookie
    html5 use video camera
  • 原文地址:https://www.cnblogs.com/chen-jie/p/JavaScript-Abstract-Factory.html
Copyright © 2011-2022 走看看