一天一个设想形式之JS完成——工场形式

参考文章:
深切明白java三种工场情势
工场情势,工场要领情势,笼统工场情势 详解

工场情势(Factory Pattern)是 Java 中最经常运用的设想情势之一。这类范例的设想情势属于建立型情势,它供应了一种建立对象的最好体式格局。
在工场情势中,我们在建立对象时不会对客户端暴露建立逻辑,并且是经由历程运用一个配合的接口来指向新建立的对象。

工场情势依据工场笼统级别分为三种:
1、简朴工场情势
2、工场要领情势
3、笼统工场情势

工场情势的角色平常有以下几个:
1、笼统工场类(注:简朴工场无此类)
2、详细工场类
3、笼统产物类
4、详细产物类

简朴工场情势

class BMW {
    drive() {
        console.log('drive bmw...');
    }
}
class Benz {
    drive() {
        console.log('drive Benz...');
    }
}
class Factory {
    getBMWCar() {
        return new BMW();
    }
    getBenzCar() {
        return new Benz();
    }
}

var f1 = new Factory();
f1.getBMWCar().drive();
f1.getBenzCar().drive();

当须要增加一类产物时,须要在工场里增加对应的临盆逻辑,违犯了开闭准绳,简朴工场情势只在异常简朴的情况下运用。

工场要领情势

因为简朴工场的弊病显著,更多时刻运用到的是工场要领情势,工场要领情势把临盆历程下放到派生类,所以当增加一类产物的时刻只需增加一个工场,扩展性加强。

注:因为JS没有接口也没有笼统类的说法,用以下的情势模仿。

class FactoryInterface {
    constructor() {
        if (Object.getPrototypeOf(this) === FactoryInterface.prototype) {
            throw new Error('该类是笼统类,没法实例化')
        }
    }
    getCar() {
        throw new Error('派生类必需完成该要领,笼统函数没法直接挪用!');
    }
}   
class BMWFactory extends FactoryInterface {
    getCar() {
        return new BMW();
    }
}
class BenzFactory extends FactoryInterface {
    getCar() {
        return new Benz();
    }
}
var bmwF = new BMWFactory();
var benzF = new BenzFactory();
bmwF.getCar().drive();
benzF.getCar().drive();

笼统工场情势

笼统工场情势的用意为:给客户端供应一个接口,能够建立多个产物族中的产物对象。而且运用笼统工场情势还要满足以下前提:
1.体系中有多个产物族,而体系一次只能够消耗个中一族产物
2.同属于同一个产物族的产物以其运用。
举个例子,宝马和奔驰两个牌子都有越野车和商务车,宝马系的是一个产物族,奔驰系的也是一个产物族,每一个产物族下面都有相类似的产物。

class SportsCar {
    constructor() {
        if (Object.getPrototypeOf(this) === SportsCar.prototype) {
            throw new Error('该类是笼统类,没法实例化')
        }
    }
    crossCountry() {
        throw new Error('派生类必需完成该要领,笼统函数没法直接挪用!');
    }
}
class BussinessCar {
    constructor() {
        if (Object.getPrototypeOf(this) === BussinessCar.prototype) {
            throw new Error('该类是笼统类,没法实例化')
        }
    }
    talkBusiness() {
        throw new Error('派生类必需完成该要领,笼统函数没法直接挪用!');
    }
}
class BMWSportsCar extends SportsCar {
    crossCountry() {
        console.log('宝马去越野');
    }
}
class BenzSportsCar extends SportsCar {
    crossCountry() {
        console.log('奔驰去越野');
    }
}
class BMWBussinessCar extends BussinessCar {
    talkBusiness() {
        console.log('宝马去谈买卖');
    }
}
class BenzBussinessCar extends BussinessCar {
    talkBusiness() {
        console.log('奔驰去谈买卖');
    }
}
class AbstractFactory {
    constructor() {
        if (Object.getPrototypeOf(this) === AbstractFactory.prototype) {
            throw new Error('该类是笼统类,没法实例化')
        }
    }
    getSportsCar() {
        throw new Error('派生类必需完成该要领,笼统函数没法直接挪用!');
    }
    getBussinessCar() {
        throw new Error('派生类必需完成该要领,笼统函数没法直接挪用!');
    }
}

class BMWSoleFactory extends AbstractFactory {
    getSportsCar() {
        return new BMWSportsCar();
    }
    getBussinessCar() {
        return new BMWBussinessCar();
    }
}
class BenzSoleFactory extends AbstractFactory {
    getSportsCar() {
        return new BenzSportsCar();
    }
    getBussinessCar() {
        return new BenzBussinessCar();
    }
}

var benf2 = new BenzSoleFactory();
var bmwf2 = new BMWSoleFactory();
benf2.getSportsCar().crossCountry();
benf2.getBussinessCar().talkBusiness();
bmwf2.getSportsCar().crossCountry();
bmwf2.getBussinessCar().talkBusiness();

小结:
工场情势的作用是解耦了产物的临盆和运用部份,让运用须要的产物的时刻只须要挪用对应的接口即可,削减冗余代码。
长处:1、隐蔽了临盆历程,只需挪用响应接口;2、扩展性好,当须要增加一类产物时,只需增加对应工场类即可。
与制作者情势区分:工场情势不须要客户端体贴构建历程,只须要相识产物对应的工场即可;制作者情势更多的是构建具有庞杂的内部结构的对象,历程由Derector掌握。

    原文作者:我爱学习
    原文地址: https://segmentfault.com/a/1190000014104914
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞