抽象工厂与封装变化

讨论一下23种设计模式中的抽象工厂是怎么样封装在对象创建时候的变化的。
   抽象工厂模式主要用于需要创建一系列的对象的场景。典型的比如各种不同品牌的汽车的创建。 假设每一个品牌的汽车由车轮,车身和发动机三个部件组成。 这样,主要有以下几个变化点, 每一品牌的汽车的各个部件的变化,比如对于车轮, 分别有BMW和BERO两个种类。 对其它部件 也是这样。 那么,这样就有三个变化点, 车轮,车身和发动机的种类的变化。 我们分别采用抽象来封装这三个变化点,这样就产生了3个抽象的类车轮,车身和发动机。每一类包含两个品牌的具体类。这样, 在客户代码中,就可以直接使用这些抽象的类(面对接口编程),这样就可以大大的提高程序的可扩展性了。

其次, 还有一个主要的变化点, 就是当在客户代码中需要创建一个汽车类的时候,它可能需要创建不同品牌的汽车,也就是说, 创建的汽车的种类是变化的,这也是一个变化点。 但是,在创建某种具体的汽车的时候, 需要的步骤是相对不变的, 比如, 都需要创建车轮,车身和发动机。 这样,我们就把代码中的变化的部分和不变的部分区分开来了。 然后,我们提取出这些不变的部分(也就是抽象出不变的部分),达到将变化的部分封装(也就是,把变化的部分区别开来,留给客户代码).按照这个想法,我们可以抽象出一个创建汽车的抽象类CarFactory,其中包含三个接口createWheal();createBody();createEngin();这样,当客户端需要创建汽车的时候,使用该抽象接口来引用。 然后,实现该接口, 分别用于创建具体的汽车。 比如, BMWFactory类, 用于创建BMW汽车。 这个类其实是“创建汽车”过程的变化点的一个分支。然后在该类中的三个create方法中,来new具体的BMW类的部件。  这样,我们就把创建BMW汽车的具体过程封装在了类BMWFactory类中了。其它的类似。
  在客户端使用的时候, 使用的是CarFactory接口, 然后通过new来new出具体的汽车工厂。 这样,创建汽车的变化点就通过封装转移到了这里的new语句上了, 我们只要改变该new语句,就可很容易的创建其它种类的汽车了。

 这里 ,还偶一个值得注意的地方, 就是, 对Wheal等部件的封装, 因为在具体的工厂中的create方法中,我们是直接使用new一个具体的部件的, 这样,好像没有使用到抽象的部件类,似乎没有体现出抽象的好处。 其实不然, 对部件类的抽象, 其实主要不是用在具体工厂的create方法中的, 试想一下,如果那些部件类不被抽象,而只是一个个单独的具体的部件类, 那么在具体工厂的create方法中同样可以new到这些对象, 根本不会影响到具体工厂的create方法。
     之所以需要对部件类抽象, 主要的原因是,为了封装变化, 如果不抽象的话, 那么,一段我们需要创建另一种类的汽车的时候, 我们将需要重新定义组成该类汽车的部件的所有的具体类, 然后扩展抽象工厂。


主要需要讨论的是抽象工厂的封装功能。 正如记得有本书上所说的, 23种设计模式的命名都是依靠起主要封装作用的类的名字来命名的,果然是这样的, 就像在抽象工厂模式中, 那么起主要封装作用的当然就是抽象工厂类了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

walkingmanc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值