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

相关内容

热门资讯

一分钟内幕!科乐吉林麻将系统发... 一分钟内幕!科乐吉林麻将系统发牌规律,福建大玩家确实真的是有挂,技巧教程(有挂ai代打);所有人都在...
一分钟揭秘!微扑克辅助软件(透... 一分钟揭秘!微扑克辅助软件(透视辅助)确实是有挂(2024已更新)(哔哩哔哩);1、用户打开应用后不...
五分钟发现!广东雀神麻雀怎么赢... 五分钟发现!广东雀神麻雀怎么赢,朋朋棋牌都是是真的有挂,高科技教程(有挂方法)1、广东雀神麻雀怎么赢...
每日必看!人皇大厅吗(透明挂)... 每日必看!人皇大厅吗(透明挂)好像存在有挂(2026已更新)(哔哩哔哩);人皇大厅吗辅助器中分为三种...
重大科普!新华棋牌有挂吗(透视... 重大科普!新华棋牌有挂吗(透视)一直是有挂(2021已更新)(哔哩哔哩)1、完成新华棋牌有挂吗的残局...
二分钟内幕!微信小程序途游辅助... 二分钟内幕!微信小程序途游辅助器,掌中乐游戏中心其实存在有挂,微扑克教程(有挂规律)二分钟内幕!微信...
科技揭秘!jj斗地主系统控牌吗... 科技揭秘!jj斗地主系统控牌吗(透视)本来真的是有挂(2025已更新)(哔哩哔哩)1、科技揭秘!jj...
1分钟普及!哈灵麻将攻略小,微... 1分钟普及!哈灵麻将攻略小,微信小程序十三张好像存在有挂,规律教程(有挂技巧)哈灵麻将攻略小是一种具...
9分钟教程!科乐麻将有挂吗,传... 9分钟教程!科乐麻将有挂吗,传送屋高防版辅助(总是存在有挂)1、完成传送屋高防版辅助透视辅助安装,帮...
每日必看教程!兴动游戏辅助器下... 每日必看教程!兴动游戏辅助器下载(辅助)真是真的有挂(2025已更新)(哔哩哔哩)1、打开软件启动之...