资讯专栏INFORMATION COLUMN

js设计模式 --- 工厂设计模式(抽象工厂)

fuchenxuan / 2694人阅读

摘要:工厂设计模式工厂设计模式顾名思义就是生产对象的工厂在这里需要注意的是生产的对象都是同一规格的具有某些相同的特性否则工厂模式的意义荡然无存接口在工厂模式中有着重要的作用如果对生产的对象不实现某个接口试问我们为什么还要工厂模式工厂模式使得我们创

工厂设计模式
工厂设计模式, 顾名思义就是生产对象的工厂, 在这里需要注意的是生产的对象都是同一规格的, 具有某些相同的特性, 否则工厂模式的意义荡然无存
接口在工厂模式中有着重要的作用, 如果对生产的对象不实现某个接口, 试问我们为什么还要工厂模式, 工厂模式使得我们创建的所有事例可以一视同仁, 屏蔽了不同对象的区别, 因为他们实现的同样的接口
简单工厂

简单工厂就是工厂所生产的产品虽然都符合接口规范, 但产品无法分类, 这里简单举一个商店出售自行车的例子, 则所生产的自行车都实现了自行车的规范, 但自行车无法分辨厂家

    let BicycleShop = (function () {
    
      /* BicycleFactory namespace. */
      let BicycleFactory = {
        createBicycle: function(model) {
          let bicycle;
          
          switch(model) {
            case "The Speedster":
              bicycle = new Speedster();
              break;
            case "The Lowrider":
              bicycle = new Lowrider();
              break;
            case "The Comfort Cruiser":
            default:
              bicycle = new ComfortCruiser();
          }
          
          Interface.ensureImplements(bicycle, Bicycle);
          return bicycle;
        }
      };
    
      /* BicycleShop class, improved. */
    
      let BicycleShop = function() {};
      BicycleShop.prototype = {
        sellBicycle: function(model) {
          var bicycle = BicycleFactory.createBicycle(model);
          
          bicycle.assemble();
          bicycle.wash();
          
          return bicycle;
        }
      };
      return BicycleShop;
    
    })();
    /* The Bicycle interface. */
    
    var Bicycle = new Interface("Bicycle", ["assemble", "wash", "ride", "repair"]);
    
    /* Speedster class. */
    
    var Speedster = function() { // implements Bicycle
      ...
    };
    Speedster.prototype = {
      assemble: function() {
        ...
      },
      wash: function() {
        ...
      },
      ride: function() {
        ...
      },
      repair: function() {
        ...
      }
    };
    
    
    /* Usage. */
    
    var californiaCruisers = new BicycleShop();
    var yourNewBike = californiaCruisers.sellBicycle("The Speedster");

简单工厂的弊端在于所有的对象都有工厂类来实现, 无法对对象分类, 降低了拓展性, 比如如果有膜拜自行车专卖店和ofo自行车专卖店呢, 所以简单的业务简单工厂就够了, 如果面对复杂业务逻辑则需要抽象工厂模式
抽象工厂

真正的工厂模式与简单工厂区别在于, 它不是使用工厂类来生产对象的, 而是使用其子类, 将其成员对象的实例化推迟到子类中, 这样就可以对自行车进行分类, 例如工厂类为接口或抽象类, 膜拜自行车工厂和ofo自行车工厂为子类, 当然这两家的自行车都实现了自行车接口, 下面如图所示;

首先定义一个工厂类

    var BicycleShop = (function() {
    
      let BicycleShop = function() {};
      BicycleShop.prototype = {
        sellBicycle: function(model) {
          var bicycle = this.createBicycle(model);      
          return bicycle;
        },
        createBicycle: function(model) {
          throw new Error("Unsupported operation on an abstract class.");
        }
      };
      return  BicycleShop
    })();

然后定义多个继承工厂类的基于分类的类

    let AcmeBicycleShop = (function() {
    
      /* AcmeBicycleShop class. */
    
      let AcmeBicycleShop = function() {};
      extend(AcmeBicycleShop, BicycleShop);
      AcmeBicycleShop.prototype.createBicycle = function(model) {
        let bicycle;
    
        switch(model) {
          case "The Speedster":
            bicycle = new AcmeSpeedster();
            break;
          case "The Lowrider":
            bicycle = new AcmeLowrider();
            break;
          case "The Flatlander":
            bicycle = new AcmeFlatlander();
            break;
          case "The Comfort Cruiser":
          default:
            bicycle = new AcmeComfortCruiser();
        }
    
        Interface.ensureImplements(bicycle, Bicycle);
        return bicycle;  
      };
      return AcmeBicycleShop
    })();
    
    var GeneralProductsBicycleShop = (function() {
    
      /* GeneralProductsBicycleShop class. */
    
      let GeneralProductsBicycleShop = function() {};
      extend(GeneralProductsBicycleShop, BicycleShop);
      GeneralProductsBicycleShop.prototype.createBicycle = function(model) {
        let bicycle;
    
        switch(model) {
          case "The Speedster":
            bicycle = new GeneralProductsSpeedster();
            break;
          case "The Lowrider":
            bicycle = new GeneralProductsLowrider();
            break;
          case "The Flatlander":
            bicycle = new GeneralProductsFlatlander();
            break;
          case "The Comfort Cruiser":
          default:
            bicycle = new GeneralProductsComfortCruiser();
        }
    
        Interface.ensureImplements(bicycle, Bicycle);
        return bicycle;
      };
    
    
    })();

最后使用

    /* Usage. */
    
    var alecsCruisers = new AcmeBicycleShop();
    var yourNewBike = alecsCruisers.sellBicycle("The Lowrider");
    
    var bobsCruisers = new GeneralProductsBicycleShop();
    var yourSecondNewBike = bobsCruisers.sellBicycle("The Lowrider");
抽象工厂模式可以把公共代码放在父类中, 个体性的代码放在子类中, 责任分离的同时提高拓展性

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107360.html

相关文章

  • js常用设计模式实现(二)工厂模式抽象工厂模式

    摘要:抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。前边的两个都是直接生产实例的,开始以为抽象工厂也是但是后来发现抽象工厂更像是生产工厂,其实抽象工厂其实是实现子类继承父类的方法。 创建型模式 创建型模式是对一个类的实例化过程进行了抽象,把对象的创建和对象的使用进行了分离 上一篇介绍了下单例模式,这一篇介绍一下工厂模式和抽象工厂模式,...

    meteor199 评论0 收藏0
  • 一天一个设计模式JS实现——工厂模式

    摘要:参考文章深入理解三种工厂模式工厂模式,工厂方法模式,抽象工厂模式详解工厂模式是中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 参考文章:深入理解java三种工厂模式工厂模式,工厂方法模式,抽象工厂模式 详解 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的...

    Muninn 评论0 收藏0
  • JS 设计模式 七(抽象工厂模式

    摘要:抽象工厂模式抽象工厂是工厂模式的升级版,他用来创建一组相关或者相互依赖的对象。代码抽象工厂模式抽象工厂的优点抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。 抽象工厂模式 抽象工厂是工厂模式的升级版,他用来创建一组相关或者相互依赖的对象。上节学习了工厂模式,类的创建依赖工厂类,程序需要扩展时,我们必须创建新的工厂类。工厂类是用来生产产品的,那我...

    FuisonDesign 评论0 收藏0
  • JS 抽象工厂模式

    摘要:简介抽象工厂模式就是通过类的抽象使得业务适用于一个产品类簇的创建,而不负责某一类产品的实例。通过抽象工厂,就可以创建某个类簇的产品,并且也可以通过来检查产品的类别,也具备该类簇所必备的方法。 0. 简介 抽象工厂模式(Abstract Factory)就是通过类的抽象使得业务适用于一个产品类簇的创建,而不负责某一类产品的实例。 JS中是没有直接的抽象类的,abstract是个保留字,但...

    RiverLi 评论0 收藏0
  • 从ES6重新认识JavaScript设计模式(二): 工厂模式

    摘要:简单工厂模式简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例。工厂方法模式工厂方法模式的本意是将实际创建对象的工作推迟到子类中,这样核心类就变成了抽象类。抽象工厂模式一般用在 1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式。我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式根据抽象程度的不...

    Reducto 评论0 收藏0
  • 从ES6重新认识JavaScript设计模式(二): 工厂模式

    摘要:简单工厂模式简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例。工厂方法模式工厂方法模式的本意是将实际创建对象的工作推迟到子类中,这样核心类就变成了抽象类。抽象工厂模式一般用在 1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式。我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式根据抽象程度的不...

    szysky 评论0 收藏0

发表评论

0条评论

fuchenxuan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<