(三)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' }  */ 

相关内容

热门资讯

一分钟带你了解“h5反杀工具”... 一分钟带你了解“h5反杀工具”附开挂插件辅助详细教程 >>您好:软件加薇136704302信确实是有...
教程辅助“约局吧德州可以透视吗... 教程辅助“约局吧德州可以透视吗”开挂(透视)辅助安装-哔哩哔哩>>您好:软件加薇136704302中...
三分钟辅助“789大菠萝可以控... 三分钟辅助“789大菠萝可以控制吗”开挂(透视)辅助安装2026新版-哔哩哔哩>>您好:软件加136...
一分钟教会你"手机微... 手机微乐小程序破解器开挂教程视频分享装挂详细步骤在当今的网络游戏中,手机微乐小程序破解器作为一种经典...
信息共享“衢州都莱有没有辅助器... 您好:这款衢州都莱有没有辅助器游戏是可以开挂的,确实是有挂的,很多玩家在这款衢州都莱有没有辅助器游戏...
教程辅助“欢乐达人模拟器”开挂... 欢乐达人模拟器 无需打开直接搜索微信:136704302本司针对手游进行,选择我们的四大理由: 1、...
三分钟辅助“微乐游戏小程序辅助... 三分钟辅助“微乐游戏小程序辅助器免费苹果版”开挂(透视)辅助插件技巧教程-知乎>>您好:软件加136...
避坑细节"hhpok... 避坑细节"hhpoker免费透视脚本"开挂(插件)辅助插件详细教程-有挂教程【无需打开直接搜索加薇1...
普及知识“闲聚鱼虾蟹软件脚本辅... 普及知识“闲聚鱼虾蟹软件脚本辅助器”附开挂插件辅助详细教程 【无需打开直接搜索加薇136704302...
教程辅助“闲逸app透视版”开... 闲逸app透视版是一款专注玩家量身打造的游戏记牌类型软件,在闲逸app透视版这款游戏中我们可以记录下...