打字猴:1.700446435e+09
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 }
1700446467
1700446468 Car是一个接口,完全合乎createCar方法的要求,所以它在编译时不会报任何错误,但一运行起来就会报InstantiationException异常。而使用枚举类型的工厂方法模式就不存在该问题了,不需要传递任何参数,只需要选择好生产什么类型的产品即可。
1700446469
1700446470 (2)性能好,使用便捷
1700446471
1700446472 枚举类型的计算是以int类型的计算为基础的,这是最基本的操作,性能当然会快,至于使用便捷,注意看客户端的调用,代码的字面意思就是“汽车工厂,我要一辆别克汽车,赶快生产”。
1700446473
1700446474 (3)降低类间耦合
1700446475
1700446476 不管生产方法接收的是Class、String还是int的参数,都会成为客户端类的负担,这些类并不是客户端需要的,而是因为工厂方法的限制必须输入的,例如Class参数,对客户端main方法来说,它需要传递一个FordCar.class参数才能生产一辆福特汽车,除了在create方法中传递该参数外,业务类不需要改Car的实现类。这严重违背了迪米特原则(Law of Demeter,简称为LoD),也就是最少知识原则:一个对象应该对其他对象有最少的了解。
1700446477
1700446478 而枚举类型的工厂方法就没有这种问题了,它只需要依赖工厂类就可以生产一辆符合接口的汽车,完全可以无视具体汽车类的存在。
1700446479
1700446480 注意 下一次,使用枚举来实现工厂方法模式。
1700446481
1700446482
1700446483
1700446484
[ 上一页 ]  [ :1.700446435e+09 ]  [ 下一页 ]