(三)js前端开发中设计模式之工厂模式
创始人
2025-01-07 03:06:01
0次

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

简单工厂模式

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 中添加即可
// 升级版 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(); 

真正工厂模式

  • 与简单工厂模式的区别在于,他不是使用一个类或是对象来创建实例,而是使用一个子类来创建实例
  • 按照正式的定义,工厂模式是一个将其成员对象的实例化延迟到子类中进行的模式。
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' }  */ 

相关内容

热门资讯

菠萝智星德州详情!wepoke... 菠萝智星德州详情!wepoker是不是技术越好牌就越好(透视),原本真的是有透视软件主打赛后复盘的 ...
WePoKer有挂!微扑克发牌... WePoKer有挂!微扑克发牌真的很假(辅助),竟然是真的有辅助软件是一款可以让一直输的玩家,快速成...
红龙PoKer必备!wepok... 您好,wepoker开挂透视方法这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】...
德州扑克科普!德扑之星辅助下载... 您好,德扑之星辅助下载这款游戏可以开挂的,确实是有挂的,需要了解加微【485275054】很多玩家在...
aapoker总结!微扑克辅助... aapoker总结!微扑克辅助封号(辅助器),总是真的有辅助器安装是一款可以让一直输的玩家,快速成为...
微扑克普及!AlphaQ德州辅... 微扑克普及!AlphaQ德州辅助怎么样(辅助器),一向是真的有辅助器安装主打赛后复盘的 AI 游戏攻...
德州扑克必备!德州辅助app官... 您好,德州辅助app官方最新版本介绍大全这款游戏可以开挂的,确实是有挂的,需要了解加微【136704...
智星菠萝德州关于!德扑之星开挂... 智星菠萝德州关于!德扑之星开挂辅助器(辅助器),先前是有辅助器神器是一款可以让一直输的玩家,快速成为...
菠萝智星德州揭露!德扑之星系统... 您好:德扑之星系统规律这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌...
WOK关于!wepoker辅助... WOK关于!wepoker辅助挂是什么(透视挂),原本是真的有透视挂软件AI 智能体黑科技再上新,自...