打字猴:1.700476504e+09
1700476504 设计模式之禅 [:1700454066]
1700476505 设计模式之禅 30.2 抽象工厂模式VS建造者模式
1700476506
1700476507 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品,两者的区别还是比较明显的,但是还有读者对这两个模式产生混淆,我们通过一个例子说明两者的差别。
1700476508
1700476509 现代化的汽车工厂能够批量生产汽车(不考虑手工打造的豪华车)。不同的工厂生产不同的汽车,宝马工厂生产宝马牌子的车,奔驰工厂生产奔驰牌子的车。车不仅具有不同品牌,还有不同的用途分类,如商务车Van,运动型车SUV等,我们按照两种设计模式分别实现车辆的生产过程。
1700476510
1700476511 30.2.1 按抽象工厂模式生产车辆
1700476512
1700476513 按照抽象工厂模式,首先需要定义一个抽象的产品接口即汽车接口,然后宝马和奔驰分别实现该接口,由于它们只具有了一个品牌属性,还没有定义一个具体的型号,属于对象的抽象层次,每个具体车型由其子类实现,如R系列的奔驰车是商务车,X系列的宝马车属于SUV,我们来看类图,如图30-3所示。
1700476514
1700476515
1700476516
1700476517
1700476518 图30-3 车辆生产的工厂类图
1700476519
1700476520 在类图中,产品类很简单,我们从两个维度看产品:品牌和车型,每个品牌下都有两个车型,如宝马SUV,宝马商务车等,同时我们又建造了两个工厂,一个专门生产宝马车的宝马工厂BMWFactory,一个是生产奔驰车的奔驰车生产工厂BenzFactory。当然,汽车工厂也有两个不同的维度,可以建立这样两个工厂:一个专门生产SUV车辆的生产工厂,生产宝马SUV和奔驰SUV,另外一个工厂专门生成商务车,分别是宝马商务车和奔驰商务车,这样设计在技术上是完全可行的,但是在业务上是不可行的,为什么?这是因为你看到过有一个工厂既能生产奔驰SUV也能生产宝马SUV吗?这是不可能的,因为业务受限,除非是国内的山寨工厂。我们先来看产品类,汽车接口如代码清单30-12所示。
1700476521
1700476522 代码清单30-12 汽车接口
1700476523
1700476524 public interface ICar{
1700476525
1700476526 //汽车的生产商,也就是牌子
1700476527
1700476528 public String getBand();
1700476529
1700476530 //汽车的型号
1700476531
1700476532 public String getModel();
1700476533
1700476534 }
1700476535
1700476536 在产品接口中我们定义了车辆有两个可以查询的属性:品牌和型号,奔驰车和宝马车是两个不同品牌的产品,但不够具体,只是知道它们的品牌而已,还不能够实例化,因此还是一个抽象类,如代码清单30-13所示。
1700476537
1700476538 代码清单30-13 抽象宝马车
1700476539
1700476540 public abstract class AbsBMW implements ICar{
1700476541
1700476542 private final static String BMW_BAND=“宝马汽车”;
1700476543
1700476544 //宝马车
1700476545
1700476546 public String getBand(){
1700476547
1700476548 return BMW_BAND;
1700476549
1700476550 }
1700476551
1700476552 //型号由具体的实现类实现
1700476553
[ 上一页 ]  [ :1.700476504e+09 ]  [ 下一页 ]