Javascript设计模式之抽象工厂(三)

创建型设计模式-抽象工厂模式

定义

通过对类的工厂抽象使其业务用于对产品类蔟的创建,而不用负责创建某一类产品的实例。
谈及抽象工厂模式,就必然需要说明下何谓抽象类呢?接触过面向对象编程的语言的人,比如java,c#等。应该都知道他们对于抽象类拥有着关键字abstract class,所谓抽象,就是父类抽象共通方法特性,但是具体实现由每个子类去实现该方式。 如果没有实现该父类的方法,则父类应该提示子类,其特性存在未实现的

抽象类说明 —————》代码示例

function AbstractClass (){
  this.name = 'This is a abstractClass';
}
AbstractClass.prototype = {
     getName : function(){
        return new Error('抽象方法无法调用');
     },
     getInfo : function(){
        return new Error('抽象方法无法调用');
     }    
}

抽象工厂模式

这里我直接板书书上案例进行说明。

//这里是一个抽象工厂方法,内部单纯的实现继承的方法。
let VehicleFactory = function (SubType, SuperType) {
        if (typeof VehicleFactory[SuperType] === 'function') {
            console.log(`That's true`);
            // 缓存类
            function F () {
            };
            F.prototype = new VehicleFactory[SuperType]();
            SubType.constructor = SubType;
            SubType.prototype = new F();
        } else {
            return new Error('未创建该对象');
        }

    }
    // 小汽车的抽象类
    VehicleFactory.Car = function () {
        this.type = 'car';
    }
    VehicleFactory.Car.prototype = {
        getPrice () {
            return new Error('抽象方法不能调用');
        },
        getSpeed () {
            return new Error('抽象方法不能调用');
        }
    }
    // 公交车 抽象类
    VehicleFactory.Bus = function () {
        this.type = 'bus';
    }
    VehicleFactory.Bus.prototype = {
        getPrice () {
            return new Error('抽象方法不能调用');
        },
        getPassengerNumber () {
            return new Error('抽象方法不能调用');
        }
    }
   // 卡车 抽象类
    VehicleFactory.Truck = function () {
        this.type = 'truck';
    }
    VehicleFactory.Truck.prototype = {
        getPrice () {
            return new Error('抽象方法不能调用');
        },
        getTrainload () {
            return new Error('抽象方法不能调用');
        }
    }

抽象方法的实现与调用

let BMW = function (price, speed) {
        // 调用父类构造方法,这里书中是没有的,需要加上,不然无法获取父类的公有属性
        VehicleFactory.Car.call(this);
        this.price = price;
        this.speed = speed;
    }
    VehicleFactory(BMW, 'Car'); //实现继承
    // 重写父类原型对象的方法,注意我们需要先继承父类,
    // 再重写父类的方法,否则你重写的方法会被父类所覆盖
    BMW.prototype = {
        getPrice () {
            return this.price;
        },
        getSpeed () {
            return this.speed;
        }
    }
    let bmw = new BMW(100000, 9999);
    console.log(bmw.getPrice());  // 100000
    console.log(bmw.type);  // car 父类公有属性

备注:抽象工厂模式是设计模式中最为抽象的一种,也是创建模式中唯一一种抽象化创建模式。该模式创建出的结果不是一个真实的对象实例,而是一个类蔟,它制定了类的结构,这也就区别了简单工厂模式创建单一对象,工厂方法模式创建多类对象。当然由于Javascript 中不支持抽象化创建和虚拟方法,所以导致这种模式无法像其他对象语言中应用的那么广泛。

参考书籍: 《JavaScript 设计模式》张容铭
同时大家也可参考这位读者的观后感

猜你喜欢

转载自blog.csdn.net/weixin_39370315/article/details/79785866