// 接口var Interface = function(name, methods) {    if (arguments.length != 2) {     throw new Error("Interface constructor called with " + arguments.length                + "arguments, but expected exactly 2.");   }

   this.name = name;    this.methods = [];   for (var i = 0, len = methods.length; i < len; i++) {      if (typeof methods[i] !== 'string') {         throw new Error("Interface constructor expects method names to be "                 + "passed in as a string.");       }     this.methods.push(methods[i]);    }};// 接口检查Interface.ensureImplements = function(object) {  if (arguments.length < 2) {        throw new Error("Function Interface.ensureImplements called with "              + arguments.length + "arguments, but expected at least 2.");  }

   for (var i = 1, len = arguments.length; i < len; i++) {        var v_interface = arguments[i];      if (v_interface.constructor !== Interface) {            throw new Error("Function Interface.ensureImplements expects arguments "                    + "two and above to be instances of Interface.");      }

       for (var j = 0, methodsLen = v_interface.methods.length; j < methodsLen; j++) {            var method = v_interface.methods[j];         if (!object[method] || typeof object[method] !== 'function') {                throw new Error("Function Interface.ensureImplements: object "                      + "does not implement the " + v_interface.name                        + " interface. Method " + method + " was not found.");         }     } }};// 原形继承function clone(object) {  function F() {    } F.prototype = object;    return new F;}

// 抽象工厂var AbstractFactory = (function() { // 抽象方法检查 function checkImplements(object) {        var isContain = false;       var v_method = '';     if (arguments.length < 2) {            throw new Error("Function AbstractFactory.checkImplements called with "                 + arguments.length + "arguments, but expected at least 2.");      }     for (var i = 1; i < arguments.length; i++) {            var v_AbstractClass = arguments[i];          for (key in v_AbstractClass) {                if (!object[key] && typeof object[key] !== 'function'                     && key != 'getFactory') {                  isContain = true;                    v_method = key;                  break;                }         }     }     if (isContain) {          throw new Error("Function AbstractFactory.ensureImplements: object "                    + "does not implement the AbstractFactory "                    + "AbstractCalss. AbstractMethod "                 + v_method                   + " was not found.");      } } // 选择具体工厂 function chooesFactory(mode) {        var factory = null;      switch (mode) {           case 'giant' :              factory = GiantFactory;              break;            case 'cnforever' :              factory = CnforeverFactory;              break;            case 'merida' :             factory = MeridaFactory;             break;            default :             throw new Error("mode not found");      }     checkImplements(factory, AbstractFactory)     return factory;   } return {      getFactory : function(mode) {         return chooesFactory(mode);       },        // 抽象方法       createBicycle : function() {          throw new Error('Unsupported operation on an abstract class:createBicycle');        } }})();// 继承var GiantFactory = clone(AbstractFactory);GiantFactory = {   // 实现父类抽象方法   createBicycle : function() {      var giantBicycle = new GiantBicycle();       Interface.ensureImplements(giantBicycle, Bicycle);        return giantBicycle;  }};// 创建接口var Bicycle = new Interface("Bicycle", ['assemble', 'wash', 'ride', 'repair']);var GiantBicycle = function() {

};// 实现接口GiantBicycle.prototype = {  assemble : function() {       alert('组装');    },    wash : function() {       alert('清洗');    },    ride : function() {

 },    repair : function() {

   }};

var BicycleShop = function() {};// 入口BicycleShop.prototype = {   sellBicycle : function(mode) {        var bicycle = AbstractFactory.getFactory(mode).createBicycle();      bicycle.assemble();       bicycle.wash();;      return bicycle;   }}

var bicycleShop = new BicycleShop();bicycleShop.sellBicycle('giant');

js 抽象工厂模式B相关推荐

  1. js 抽象工厂模式

    抽象类的主要作用:定义一个产品簇,声明必备的方法,如果子类没有重写就会抛出错误. var abstructFactory = function(child,father){if(typeof abst ...

  2. 设计模式(6)[JS版]-JavaScript如何实现抽象工厂模式?

    目录 1 学习目标 2 什么是抽象工厂模式? 3 抽象工厂模式作用 4 工厂模式参与者 5 代码实现 1 学习目标 通过本篇文章的学习,你应当掌握以下知识: 1 知道什么是抽象工厂模式? 2 掌握抽象 ...

  3. js设计模式抽象工厂模式

    抽象工厂模式(Abstract Factory) 通过类的抽象使得业务适用于一个产品类簇的创建,而不负责创建某一类产品的实例. JS中是没有直接的抽象类的,因此我们需要在类的方法中抛出错误来模拟抽象类 ...

  4. JS学习六(抽象工厂模式)

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

  5. 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...

    在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV, ...

  6. 编程模式 之美 -- 抽象工厂模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现如下: C++实现 C语言实现 4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服.此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建 ...

  7. 工厂方法模式和抽象工厂模式

    工厂方法模式和抽象工厂模式 工厂方法模式 抽象工厂模式 总结: 工厂方法模式 #include <string> #include <iostream>// Abstract ...

  8. 抽象工厂模式AbstractFactory

    简介 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽象工厂模式又称为Kit模式,属于对象创建型模式. 不同点 ...

  9. 工厂方法模式与抽象工厂模式的区别

    工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类. 一个抽象工厂类,可以派生出多个具体工厂类. 每个具体工厂类只能创建一个具体产品类的实例. 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以 ...

最新文章

  1. 为什么CNN模型要使用很多小的卷积核,比如3x3,而不是7x7或者9x9呢?
  2. 【Windows 逆向】OD 调试器工具 ( OD 附加进程 | OD 调试器面板简介 | 反汇编窗口 | 寄存器窗口 | 数据窗口 | 堆栈窗口 )
  3. 彩色图像分割MATLAB代码
  4. java 操作 word 表格和样式_poi 操作excel和word(修改样式和内容)
  5. 在sublime text 3中安装中文支持
  6. CXF小窥:知道服务器端wsdl地址,如何本地测试服务接口
  7. Linux文件基本操作
  8. JDK源码解析之 Java.lang.Package
  9. 为什么main方法是public static void?
  10. 调用者保存寄存器和非调用者保存寄存器
  11. linux mkdir 系统调用,Linux Rootkit 系列四:对于系统调用挂钩方法的补充
  12. 视觉SLAM——ceres非线性最小二乘求解器
  13. Activity/Fragment最强生命周期总结
  14. plugin工程及与flutter工程通信原理
  15. android视频教程地址
  16. 入职阿里两年的工作总结
  17. Zabbix监控流量异常(偶尔超出交换机限制)
  18. 大尺寸共阴数码管驱动电路
  19. HTML 教程(初级)
  20. Scaling Apps with Varnish

热门文章

  1. java面向过程开发,刚接触java的体验
  2. 企业如何实现便捷化文档管理
  3. 2018蓝桥杯模拟赛(一)H【floyd求最短路径】
  4. 中国数据复制第一股:英方软件做对了什么?
  5. 九龙证券|技股成大赢家!抗菌面料“妖股”大跌(A股二级市场篇)
  6. 工具-Excel-将多个单元格的文字内容转变为一个单元格内
  7. 怎么修改html超链接方向,如何修改HTML超链接样式?
  8. 移动端pdf添加手势
  9. 网页提交,点击浏览器返回按钮,网页出错
  10. Fiddler手机软件抓包教程