参考文章:
深切明白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掌握。