工厂方法和抽象工厂

要创建一个对象,可以使用new关键字,但是这样的初始化方式常常导致耦合的问题,如何避免这样的问题呢?我们来重点研究一下工厂方法模式和抽象工厂模式。

 

工厂方法模式

       

        工厂方法模式定义了一个创建对象的接口,让这个接口的实现来决定具体要实例化的类,工厂方法使得

类把实例化延迟到了子类。要做到这个我们就要为每一种要被生产的具体产品创建一个工厂。来看看java中SOAPConnection创建的例子。要发送SOAP request,要先创建SOAPConnection,代码如下:

SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
soapConnection.call(...);

        可以看出客户端在创建SOAPConnection的时候,只知道一个可以创建SOAPConnection的工厂,但并不知道这个工厂是如何将SOAPConnection生产出来的。实际上SOAPConnectionFactory.newInstance()拿到的是一个HttpSOAPConnectionFactory(具体工厂),最后由这个具体的工厂创建HttpSOAPConnection这个具体的产品。



 SOAPConnectionFactory中的createConnection()方法就是一个工厂方法,对具体产品的创建被“延迟”到了HttpSOAPConnectionFactory中。可以看出工厂方法将创建对象的过程被很好的封装了起来,当你需要创建一个新的具体产品的时候,只需要新增具体产品的类和一个对应的创建该产品的工厂类即可,客户端可以通过反射机制拿到具体工厂,再由工厂来创建对象,这是符合开闭原则的。

 

抽象工厂

 

    抽象工厂简单的说是为了创建产品族而生的。什么是产品族呢?可以理解为一组相关联的位于不同产品等级结构的产品组成的家族。举个例子,一个生产车轮的工厂,每一个车轮都包含了生产轮毂,外胎,内胎,所以轮毂、外胎、内胎可以说是一组相关联的产品,什么叫做不同产品等级结构呢?小汽车的车轮、公共汽车的车轮、卡车的车轮都是不同的,所以它们需要生产的轮毂、内胎、外胎也不同,小汽车、公共汽车、卡车的等级结构是不同的。现在我们要开始组装车轮了,抽象工厂的结构到底是怎么样的呢?



    可以看到制造轮胎需要的具体产品是由CarWheelMaterialFactoryBussWheelMaterialFactory两个具体工厂来生产的,这两个具体工厂分别创造出来一个产品族。如果这个生产轮子的车间要转型不满足于生产轿车和公共汽车的轮子,而是生产卡车轮子,会发生什么?只需要新增卡车内胎,卡车外胎,卡车轮毂三个具体产品,再增加一个卡车轮子材料工厂即可。因为抽象工厂可以创造一个完整的产品系列,所以只需要扩展具体工厂和具体产品,再切换一下客户端使用的具体的工厂即可。

   

    抽象工厂也有很显而易见的缺点,就是需要增加产品时,需要修改到几乎所有的类,比如我们制造轮胎时,除了内胎,外胎,轮毂,汽车厂商要求一起制造安装轮子到汽车上时需要用到的配套螺栓,BusWheelBusWheel的螺栓,CarWheelCarWheel的螺栓。这时我们的抽象工厂需要增加一个创造螺栓的方法,所有的具体工厂也都需要修改用以满足生产新的产品,这一点在使用抽象工厂时要特别注意。

 

总结一下:

工厂方法模式:有一个抽象产品类,派生出多个具体产品类。另外有一个抽象工厂类,派生出多个具体工厂类,创建具体产品的逻辑被封装在了具体工厂内部。  
抽象工厂模式: 有多个有关系的抽象产品,派生出多个具体产品。具体工厂封装了创建产品族的逻辑, 让新增系列产品变得非常容易。
  
两者区别:工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建一个产品族,这个产品族包含了一系列有内在联系的具体产品。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值