JS 设想形式 六(工场形式)

工场形式

之前讲了接口,封装,继续,单例等,如今就须要运用这些特征来完成一些设想形式了。起首吧之前的代码打包成一个新的JS

DesignPattern.js

// 设想形式公用代码     
exports.Interface = function (object, 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.');
    }
    object[methods[i]] = function () {
      throw new Error(this.constructor.name + ' Interface function is undefined');
    };
  }
};

exports.Extend = function (subClass, superClass) {
  var F = function () {
  };
  F.prototype = superClass.prototype;
  subClass.prototype = new F();
  subClass.prototype.constructor = subClass;

  subClass.superclass = superClass.prototype;
  if (superClass.prototype.constructor == Object.prototype.constructor) {
    superClass.prototype.constructor = superClass;
  }
}

exports.Clone = function (object) {
  function F() {
  }

  F.prototype = object;
  return new F;
}

exports.Augment = function (receivingClass, givingClass) {
  if (arguments[2]) { // Only give certain methods.
    for (var i = 2, len = arguments.length; i < len; i++) {
      receivingClass.prototype[arguments[i]] = givingClass.prototype[arguments[i]];
    }
  }
  else { // Give all methods.
    for (methodName in givingClass.prototype) {
      if (!receivingClass.prototype[methodName]) {
        receivingClass.prototype[methodName] = givingClass.prototype[methodName];
      }
    }
  }
}

工场形式要点

1.工场接口是工场要领形式的中心,与调用者直接交互用来供应产物。

2.工场完成决议怎样实例化产物,是完成扩大的门路,须要有若干种产物,就须要有若干个详细的工场完成。

实用场景:

1.在任何须要天生庞杂对象的处所,都能够运用工场要领形式。有一点须要注重的处所就是庞杂对象合适运用工场形式,而简朴对象,无需运用工场形式。

2.工场形式是一种典范的解耦形式,迪米特法则在工场形式中表现的尤其显著。如果调用者本身组装产物须要增添依靠关联时,能够斟酌运用工场形式。将会大大下降对象之间的耦合度。

3.当须要体系有比较好的扩大性时,能够斟酌工场形式,差别的产物用差别的完成工场来组装。

代码

var DP = require("./DesignPattern.js");

function CarFactory() {//定义工场
  this.run = function () {
    console.log(this.productCar()+'启动');
  }
  DP.Interface(this, ['productCar']);
}

function PorscheFactory() {//实例化保时捷工场
  this.__proto__ = new CarFactory();
  this.productCar = function () {
    return '保时捷';
  }
}

function TractorFactory() {//实例化拖拉机工场并不重写接口测试接口定义
  this.__proto__ = new CarFactory();
}

var Porsche = new PorscheFactory();
Porsche.run();


var Tractor = new TractorFactory();
Tractor.run();

总结

因为javascript没有原生接口,所以须要本身想要领来完成接口这个准绳。运用了接口今后就能够轻易完成工场形式。

    原文作者:zchq88
    原文地址: https://segmentfault.com/a/1190000005133481
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞