定义:
抽象工厂其实是实现子类继承父类的方法,只是一个方法。抽象工厂模式一般用在多人协作的超大型项目中,并且严格的要求项目以面向对象的思想进行完成。

简单工厂模式和工厂模式都是直接生产实例的抽象工厂更像是生产工厂其实抽象工厂其实是实现子类继承父类的方法。

说白了 抽象工厂模式 我认为就是工厂功能模式的扩充版
简单工厂生产实例工厂功能模式生产实例的接口抽象工厂生产的是工厂

抽象类

抽象类是一种声明但是不能使用的类,当使用时就会报错。
在JavaScript中,abstract还是一个保留字,不能像传统的面向对象语言那样轻松创建。
但是JavaScript是灵活的,可以在类的方法中手动地抛出错误来模拟抽象类。

如下:

var Car = function(){};
Car.prototype = {getPrice:function () {return new Error('抽象方法不能调用');},getSpeed:function () {return new Error('抽象方法不能调用');}
}

创建的car类什么都不能做,创建时没有任何属性,原型的方法也不能使用,但是在继承时很有用。因为父类定义了一些必要的方法,如果子类没有重写这些方法,那么调用时找到这些类就会报错。
当这些必要的方法从父类继承过来而没有具体去重写实现,那么实例化对象便会调用父类的这些方法,如果父类有友好提示,则对于忘记重写子类的错误的避免就会很有帮助。

抽象工厂模式

抽象工厂实际上是一个实现子类继承父类的,在这个方法中需要传递子类以及要继承父类的名称,并且在抽象工厂方法中增加了一次对抽象类存在性的一次判断,如果存在,则将子类继承父类的方法,然后子类通过寄生式继承。

抽象工厂方法

var VehicleFactory = function (subType,superType) {//判断抽象工厂是否有该抽象类if(typeof VehicleFactory[superType] === 'function'){//缓存类function F() {};//继承父类属性和方法F.prototype = new VehicleFactory[superType]();//将子类constructor指向子类subType.constructor = subType;//子类原型继承"父类”subType.prototype = new F();}else {//不存在该抽象类抛出错误throw new  Error('未创建该抽象类');}
}

抽象类

//小汽车抽象类
VehicleFactory.Car = function () {this.type = 'Car';
};
VehicleFactory.Car.prototype = {getPrice:function () {return new Error('抽象方法不能调用');},getSpeed:function () {return new Error('抽象方法不能调用');}
}
//货车抽象类
VehicleFactory.Truck = function () {this.type = 'Truck';
};
VehicleFactory.Truck.prototype = {getPrice:function () {return new Error('抽象方法不能调用');},getSpeed:function () {return new Error('抽象方法不能调用');}
}

抽象工厂实现对抽象类的继承

//宝马汽车子类
var BMW = function (price,speed) {this.price = price;this.speed = speed;
}
//抽象工厂实现对Car抽象类的继承
VehicleFactory(BMW,'Car');
BMW.prototype.getPrice = function () {return this.price;
}
BMW.prototype.getSpeed = function () {return this.speed;
}
//奔驰汽车子类
var BenzTruck = function(price,trainLoad){this.price = price;this.trainLoad = trainLoad;
}
//抽象工厂实现对Truck抽象类的继承
VehicleFactory(BenzTruck,'Truck')
BenzTruck.prototype.getPrice = function () {return this.price;
}
BenzTruck.prototype.getTrained = function () {return this.trainLoad;
}

通过抽象工厂,就知道每个子类到底是哪一种类别,然后它们也具有了该类所必备的属性和方法了。
测试:


//测试
var truck = new BenzTruck(1000,100);
console.log(truck.getPrice());//1000
console.log(truck.type);//Truck
var car = new BMW(10,5);
console.log(car.getPrice());//10
console.log(car.getSpeed());//5

总结
抽象工厂模式,它创建的结果不是一个对象,实现子类对"抽象类"(JavaScript没有抽象类,只是模拟抽象类)的继承,然后子类再自行实例化;

区分:
简单工厂模式:用于创建单一对象。
工厂方法模式:用于创建多类对象。
抽象工厂模式:用于创建抽象类簇。(用于产生不同产品的抽象类或者工厂类)

JavaScript设计模式———抽象工厂模式相关推荐

  1. javascript设计模式-抽象工厂模式

    1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  2. JavaScript设计模式 - 抽象工厂模式

    抽象工厂模式 这也是针对工厂模式无法应对多对象多复杂对象而出的一种模式,抽象工厂模式并不是直接生成实例,而是对于产品的一个分类的创建 class User {constructor(name, rol ...

  3. javascript设计模式--抽象工厂模式

    抽象工厂模式(abstract Fctory):通过对类的工厂抽象使其业务用于对产品类鏃的创建,而不负责创建某一类产品的实例. //汽车抽象类,当使用其实例对象的方法时会抛出错误var Car = f ...

  4. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  5. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  6. 常见设计模式—抽象工厂模式

    设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...

  7. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  8. JavaScript高级进阶之设计模式 抽象工厂模式

    抽象工厂模式 负责同一类的产品,但是不对负责某一个产品的实例,实例的任务交给创建某个产品的方法 /*** @param {Object} fun 需要抽象的方法体 函数* @param {Object ...

  9. java设计模式---抽象工厂模式

    工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...

最新文章

  1. SAP RETAIL 商品主数据里的Contents
  2. (chap4 IP协议) 全局地址和私有地址
  3. 解决Qt创建项目后只有.pro文件问题
  4. gradle之gradlew最全指令攻略
  5. oracle 容器运行_Oracle应用容器云的自由
  6. Linux: Apache 安全设定
  7. 从像素坐标到相机坐标_多视图几何基础——深入理解相机内外参数
  8. java oracle executeupdate 无效_Java语言的品味(三)
  9. docker删除镜像、容器命令
  10. C#,COM口,接收,发送数据
  11. 《MFC游戏开发》笔记二 建立工程、调整窗口
  12. gbdt算法 java实现_决策树之 GBDT 算法的回归部分
  13. Joplin 软件转换中文
  14. c语言循环菜鸟,C语言菜鸟基础教程之for循环
  15. 简易的抽奖系统(二)
  16. JavaScript基础 | Day02 JavaScript的运算符、语句、综合案例
  17. Kalman Filter 通俗讲解
  18. 中心差商公式不同的h计算近似一(二)阶导数
  19. Module build failed: Error: ENOENT: no such file or directory, scandir node_modules\node-sass\vendor
  20. JavaScript进阶(三)

热门文章

  1. 染色基础知识(三)——用什么染?
  2. jQuery剥皮二 - extend
  3. 常用的一些vscode前端插件
  4. 基于语义分割的矸石充填捣实机构防碰撞系统
  5. 零代码编程:用ChatGPT将PDF文件的表格批量转为Excel表格
  6. python建筑工程中的应用_计算机语言在rhino、Revit等建筑软件中的应用初探,个人,对于,建筑学,领域,rhinorevit,探索...
  7. Linux使用SSH上传下载文件,Linux下通过ssh scp命令上传下载文件
  8. 华南师范计算机学院优秀学生,华南师大计算机学院团委
  9. protect 继承_C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承...
  10. 用python写爱你_python表白代码-520使用Python实现quot;我爱你”表白