1700446417
1700446418
}
1700446419
1700446420
(2)通过抽象方法生成产品
1700446421
1700446422
枚举类型虽然不能继承,但是可以用abstract修饰其方法,此时就表示该枚举是一个抽象枚举,需要每个枚举项自行实现该方法,也就是说枚举项的类型是该枚举的一个子类,我们来看代码:
1700446423
1700446424
enum CarFactory{
1700446425
1700446426
FordCar{
1700446427
1700446428
public Car create(){
1700446429
1700446430
return new FordCar();
1700446431
1700446432
}
1700446433
1700446434
},
1700446435
1700446436
BuickCar{
1700446437
1700446438
public Car create(){
1700446439
1700446440
return new BuickCar();
1700446441
1700446442
}
1700446443
1700446444
};
1700446445
1700446446
//抽象生产方法
1700446447
1700446448
public abstract Car create();
1700446449
1700446450
}
1700446451
1700446452
首先定义一个抽象制造方法create,然后每个枚举项自行实现。这种方式编译后会产生两个CarFactory的匿名子类,因为每个枚举项都要实现抽象create方法。客户端的调用与上一个方案相同,不再赘述。
1700446453
1700446454
读者可能会问:为什么要使用枚举类型的工厂方法模式呢?那是因为使用枚举类型的工厂方法模式有以下三个优点:
1700446455
1700446456
(1)避免错误调用的发生
1700446457
1700446458
一般工厂方法模式中的生产方法(也就是createCar方法)可以接收三种类型的参数:类型参数(如我们的例子)、String参数(生产方法中判断String参数是需要生产什么产品)、int参数(根据int值判断需要生产什么类型的产品),这三种参数都是宽泛的数据类型,很容易产生错误(比如边界问题、null值问题),而且出现这类错误编译器还不会报警,例如:
1700446459
1700446460
public static void main(String[]args){
1700446461
1700446462
//生产车辆
1700446463
1700446464
Car car=CarFactory.createCar(Car.class);
1700446465
1700446466
}
[
上一页 ]
[ :1.700446417e+09 ]
[
下一页 ]