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

2018-12-11  本文已影响0人  简爱_cdde

/*

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

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

        */

        /*  例子:

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

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

        */

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

上一篇 下一篇

猜你喜欢

热点阅读