代码改变世界

设计模式之工厂模式

2017-06-14 22:32  o理解  阅读(239)  评论(0)    收藏  举报
// 定义构造函数
var BicycleShop = function(name) {
  this.name = name;
  this.method = function() {
    return this.name;
  }
};

BicycleShop.prototype = {
  constructor: BicycleShop,
  /* 执行方法, {model} 型号 */
  sellBicycle: function(name) {
    var bicycle = this.createBicycle(model);
    // A 业务逻辑
    bicycle.A();
    // B 业务逻辑
    bicycle.B();

    return bicycle;
  },
  createBicycle: function(name) {
    throw new Error("父类是抽象不能直接调用,需要子类重写该方法");
  }
}

//原型继承
function extend(Sub, Sup) {
  // Sub 子类,Sup 超类
  var F = function() {};

  // 设置空函数的原型为超类的原型
  F.prototype = Sup.prototype;

  // 实例化空函数,并吧超类原型引用传递给子类
  Sub.prototype = new F();

  // 重置子类原型的构造器为子类自身
  Sub.prototype.constructor = Sub;

  // 在子类中保存超类的原型,避免子类与超类耦合
  Sub.sup = Sup.portotype;

  if (Sup.prototype.constructor === Object.prototype.constructor) {
    // 检测超类原型的构造器是否为原型自身
    Sup.prototype.constructor = Sup;
  }
}

var BicycleChild = function(name) {
  this.name = name;
  // 继承构造函数父类中的属性和方法
  BicycleShop.call(this, name);
};

// 子类继承父类原型方法
extend(BicycleChild, BicycleShop);

// BicycleChild 子类重写父类的方法
BicycleChild.prototype.createBicycle = function() {
  var A = function() {
    console.log("A 业务逻辑")
  };
  var B = function() {
    console.log("B 业务逻辑")
  };
  return {
    A: A,
    B: B
  }
}

var childClass = new BicycleChild('long en');
console.log(childClass);