设计模式----抽象工厂模式

/*


        抽象工厂模式:通过对类的工厂抽象使其业务用于对产品类族的创建,而不负责创建某一类产品的实例;

        出现的都是幻觉--抽象工厂方法

        */

        /*  例子:


            我们定义一个类,在类的原型上定义了来个方法,但是在调用的时候会报错,

            但是在被子类继承后可以进行重写这些方法


        */

        /*  var Car = function () { }

          Car.prototype = {

              getPrice: function () {

                  return new Error("抽象方法不能被调用")

              },

              getSpeed: function () {

                  return new Error("抽象方法不能被调用")

              }

          }

  */

        /*

            抽象工厂方法:我们用它作为父类来创建子类,也就是说这个工厂里面的方法都是无法被使用的,

            只能是被继承然后在子类中被修改;不能用它来创建一个真实的对象

            例子:

        */

        /*

        抽象工厂方法:

        其实是一个实现子类继承父类的方法。在这个方法中我们需要通过传递子类以及要继承的父类的名称,

        并且在抽象工厂方法中又添加了一次对抽象类存在性的判断,如果存在则将子类继承父类的方法,

        然后子类通过寄生式继承,继承父类的过程中还有一个地方需要注意,就是在过渡类的原型继承时,我们不是继承

        父类的原型,而是通过new关键字复制父类的一个实例,这么做是因为过度类不仅仅继承弗雷德原型方法还要继承

        父类的对象属性,所以要通过new关键字将父类的构造函数执行一遍来复制构造函数中的属性和方法,对抽象工厂添加

        抽象类也很特殊,因为抽象工厂是个方法,不需要实例化,故只需要一份,因此直接为抽象工厂添加类的属性即可,


        */

        /*

            抽象工厂的作用是知道每个子类到底是哪一种类别的,然后他们也具备了该类所必备的属性和方法


        */

        var VehicleFactory = function (subType, superType) {

            //判断抽象工厂中是否有这个抽象的类

            if (typeof VehicleFactory[superType] === 'function') {

                //缓存类

                function F() { };

                //继承父类属性和方法

                F.prototype = new VehicleFactory[superType]();

                //将子类constructor指向子类

                subType.constructor = subType;

                subType.prototype = new F();

            } else {

                //不存在该抽象类跑出错误

                throw new Error("未创建该抽象类")

            }

        }

        //小汽车抽象类

        VehicleFactory.Car = function () {

            this.type = 'car'

        }

        VehicleFactory.Car.prototype = {

            getPrice: function () {

                return new Error("抽象方法不能被调用")

            },

            getSpeed: function () {

                return new Error("抽象方法不能被调用")

            }

        }

        //公共汽车类

        VehicleFactory.Bus = function () {

            this.type = 'bus'

        }

        VehicleFactory.Bus.prototype = {

            getPrice: function () {

                return new Error("抽象方法不能被调用")

            },

            getSpeed: function () {

                return new Error("抽象方法不能被调用")

            }

        }

        //卡车汽车类

        VehicleFactory.Truck = function () {

            this.type = 'Truck'

        }

        VehicleFactory.Truck.prototype = {

            getPrice: function () {

                return new Error("抽象方法不能被调用")

            },

            getSpeed: function () {

                return new Error("抽象方法不能被调用")

            }

        }

        //宝马汽车子类

        var BMW = function (price, speed) {

            this.price = price;

            this.speed = speed;

        }

        //抽象工厂实现对于car抽象类的继承

        VehicleFactory(BMW, "Car")

        BMW.prototype.getPrice = function () {

            return this.price;

        }

        BMW.prototype.getSpeed = function () {

            return this.speed;

        }

        var b = new BMW(100, 100);

        console.log(b.getPrice())

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,854评论 2 17
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,109评论 1 10
  • 设计原则: 要依赖抽象,不要依赖具体类 目录 本文的结构如下: 什么是抽象工厂模式 为什么要用该模式 模式的结构 ...
    w1992wishes阅读 1,144评论 0 6
  • 抽象工厂模式 介绍 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式...
    666真666阅读 1,248评论 0 7
  • 中国证监会北京监管局责令贾跃亭于12月31日前回国,责令全文如下: 近期,上市公司乐视网信息技术(北京)股份有限公...
    锦年_c8c6阅读 332评论 0 0