(三)js前端开发中设计模式之工厂模式

工厂模式是一种创建型设计模式,它可以帮助我们根据需求创建对象。

简单工厂模式

js 复制代码
const BicycleShop = function () {};

BicycleShop.prototype = {
  sellBicycle(model) {
    let bicycle;
    switch (model) {
      case "BMW":
        bicycle = new BMW();
        break;
      case "BYD":
        bicycle = new BYD();
        break;
      default:
        bicycle = new YaDi();
    }
    return bicycle;
  },
};

function BMW() {
  this.name = "BMW";
}
BMW.prototype = {
  run() {
    console.log("BMW 正在运行");
  },
};

function BYD() {
  this.name = "BYD";
}

BYD.prototype = {
  run() {
    console.log("BYD 正在运行");
  },
};

function YaDi() {
  this.name = "YaDi";
}

YaDi.prototype = {
  run() {
    console.log("YaDi 正在运行");
  },
};

//出手宝马
const bicycleShop = new BicycleShop();
bicycleShop.sellBicycle("BMW").run();
  • 这里我们把成员对象的创建工作交给了外部对象,此时我们要添加新的车型,就不用改变 BicycleShop1,只需要在 BicycleFactory 中添加即可
js 复制代码
// 升级版
const BicycleShop1 = function () {};

const BicycleFactory = {
  createBicycle(model) {
    let bicycle;
    switch (model) {
      case "BMW":
        bicycle = new BMW();
        break;
      case "BYD":
        bicycle = new BYD();
        break;
      case "LuYuan":
        bicycle = new LuYuan();
        break;
      default:
        bicycle = new YaDi();
    }
    return bicycle;
  },
};

BicycleShop1.prototype = {
  sellBicycle(model) {
    let bicycle = BicycleFactory.createBicycle(model);
    return bicycle;
  },
};

//此时我们要添加新的车型,就不用改变BicycleShop1,只需要在BicycleFactory中添加即可

function LuYuan() {
  this.name = "LuYuan";
}

LuYuan.prototype = {
  run() {
    console.log("LuYuan 正在运行");
  },
};

//出手luyuan
const bicycleShop1 = new BicycleShop1();
bicycleShop1.sellBicycle("LuYuan").run();

真正工厂模式

  • 与简单工厂模式的区别在于,他不是使用一个类或是对象来创建实例,而是使用一个子类来创建实例
  • 按照正式的定义,工厂模式是一个将其成员对象的实例化延迟到子类中进行的模式。
js 复制代码
const Bicycle = function () {};
Bicycle.prototype = {
  sellBicycle(model) {
    const bicycle = this.createBycicle(model);
    return bicycle;
  },
  createBycicle(model) {
    throw new Error("子类必须实现createBycicle方法");
  },
};

const BWMBicycle = function () {};
extend(BWMBicycle, Bicycle);
BWMBicycle.prototype.createBycicle = function (model) {
  let bicycle;
  switch (model) {
    case "BWM":
      bicycle = new BMW();
      break;
    case "Yadi":
      bicycle = new YaDi();
      break;
    default:
      throw new Error("没有该型号的自行车");
  }
  return bicycle;
};

const YADIBicycle = function () {};
extend(YADIBicycle, Bicycle);
YADIBicycle.prototype.createBycicle = function (model) {
  let bicycle;
  switch (model) {
    case "BWM":
      bicycle = new BMW();
      break;
    case "Yadi":
      bicycle = new YaDi();
      break;
    default:
      throw new Error("没有该型号的自行车");
  }
  return bicycle;
};

function BMW() {
  this.name = "BMW";
}
BMW.prototype = {
  run() {
    console.log("BMW 正在运行");
  },
};

function BYD() {
  this.name = "BYD";
}

BYD.prototype = {
  run() {
    console.log("BYD 正在运行");
  },
};

function YaDi() {
  this.name = "YaDi";
}

YaDi.prototype = {
  run() {
    console.log("YaDi 正在运行");
  },
};

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

  //子类增加了一个属性,直接指向了父类的原型对象,prorotype
  subClass.superclass = superClass.prototype;
  //正常情况下,每个类的constructor属性都是指向自己,
  //保证父类的constructor属性指向父类
  if (superClass.prototype.constructor === Object.prototype.constructor) {
    superClass.prototype.constructor = superClass;
  }
}

const bwm = new BWMBicycle();
const yadi = new YADIBicycle();
const bwmBicycle = bwm.sellBicycle("BWM");
console.log("🚀 ~ bwmBicycle:", bwmBicycle);
const bwmBicycle2 = bwm.sellBicycle("Yadi");
console.log("🚀 ~ bwmBicycle2:", bwmBicycle2);
const yadiBicycle = yadi.sellBicycle("Yadi");
console.log("🚀 ~ yadiBicycle:", yadiBicycle);
const yadiBicycle2 = yadi.sellBicycle("BWM");
console.log("🚀 ~ yadiBicycle2:", yadiBicycle2);

/**
 * 🚀 ~ bwmBicycle: { name: 'BMW' }
  🚀 ~ bwmBicycle2: { name: 'YaDi' }
  🚀 ~ yadiBicycle: { name: 'YaDi' }
  🚀 ~ yadiBicycle2: { name: 'BMW' }
 */
相关推荐
用户6919026813391 小时前
Vibe Coding 开发项目的基本范式
人工智能·设计模式·代码规范
怕浪猫1 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
Larcher3 天前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
咖啡八杯4 天前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
想吃火锅10054 天前
【前端手撕】instanceof
前端·javascript·原型模式
:mnong4 天前
学习创建结构行为设计模式
设计模式
UXbot4 天前
帮助企业低门槛开展AI应用开发的平台推荐
前端·低代码·ui·交互·产品经理·原型模式·web app
w_t_y_y4 天前
Agent设计模式(四)多模态融合模式(Multi-Modal Fusion)
设计模式
zhouhui0014 天前
订单状态的 if-else 地狱上线就崩——状态模式的工业级落地
设计模式