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

相关内容

热门资讯

四分钟俱乐部!wpk俱乐部盈利... 您好:wpk俱乐部盈利模式这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户...
玩家必知教程!wpk微扑克真的... 玩家必知教程!wpk微扑克真的有辅助插件,德州wpk到底有外挂,必备教程(有挂攻略)-哔哩哔哩;1、...
玩家必用!(轰趴十三水)外挂软... 玩家必用!(轰趴十三水)外挂软件透明挂辅助下载!(德州之星辅助透视)可靠技巧(2026已更新)(哔哩...
第6分钟晓得!hhpoker德... 第6分钟晓得!hhpoker德州有挂吗,werplan外卦神器(透视)AI教程(确实有挂)1、游戏颠...
两分钟熟悉!德州poker有外... 两分钟熟悉!德州poker有外挂吗(透明挂黑科技)外挂透明挂辅助下载(2024已更新)(哔哩哔哩);...
黑科技规律!微扑克发牌有问题,... 黑科技规律!微扑克发牌有问题,wpk辅助机器人,介绍教程(存在有挂)-哔哩哔哩;1、超多福利:超高返...
一分钟了解!(微扑克网页版)外... 一分钟了解!(微扑克网页版)外挂辅助脚本!(微扑克ai分析)透牌教程(2024已更新)(哔哩哔哩);...
第8分钟透视!智星德州辅助译码... 第8分钟透视!智星德州辅助译码插件靠谱吗,aapoker怎么设置抽水(透视)高科技教程(有挂详情)所...
九分钟科普!aa poker智... 【福星临门,好运相随】;九分钟科普!aa poker智能ai辅助介绍(透明挂黑科技)外挂透明挂辅助神...
科技通报!wepoke辅助透视... 《科技通报!wepoke辅助透视教程,wepower有辅助软件,攻略教程(有挂细节)-哔哩哔哩》 w...