Abstract Factory 模式的详细解析以及编码实例

1.模式名称
Abstract Factory,也经常称之为抽象工厂模式。
2.意图解决的问题
在程序中创建一个对象似乎是不能再简单的事情,其实不然。在大型系统开发中存在以下问题:
(1)object new ClassName 是最常见的创建对象方法,但这种方法造成类名的硬编码,需要根据不同的运行环境动态加载相同接口但实现不同的类实例,这样的创建方法就需要配合上复杂的判断,实例化为不同的对象。
(2)为了适用于不同的运行环境,经常使用抽象类定义接口,并在不同的运行环境中实现这个抽象类的子类。普通的创建方式必然造成代码同运行环境的强绑定,软件产品无法移植到其他的运行环境。
抽象工厂模式就可以解决这样的问题,根据不同的配置或上下文环境加载具有相同接口的不同类实例。
3.模式描述
Abstract Factory 模式的结构如图 10-1 所示。
在这里插入图片描述
就如同抽象工厂的名字一样,Abstract Factory 类将接受 Client 的“订单”——Client 发送过来的消息,使用不同的“车间”——不同的 Concrete Factory,根据已有的“产品模型”——Abstract Product,生产出特定的“产品”——Product。不同的车间生产出不同的产品供客户使用,车间与产品的关系是一一对应的。由于所有的产品都遵循产品模型——Abstract Product,具有相同的接口,所以这些产品都可以直接交付客户使用。
在抽象工厂模式中,Abstract Factory 可以有多个类似于 Create Product()的虚方法,就如同一个工厂中有多条产品线一样。Create Product1()创建产品线 1,Create Product2()创建产品线 2。
4.效果
应用 Abstract Factory 模式可以实现对象可配置的、动态的创建。灵活运用 Abstract Factory 模式可以提高软件产品的移植性,尤其是当软件产品运行于多个平台,或有不同的功能配置版本时,抽象工厂模式可以减轻移植和发布时的压力,提高软件的复用性。
5.相关讨论
在实际应用中,Abstract Factory 可以有更灵活的变化。事实上,如果仔细观察 AbstractFactory 模式就可以发现,对于 Client 来说,最关注的就是在不同条件下获得接口一致但实现不同的对象,只要避免类名的硬编码,采用其他方式也可以实现。所以也可以采用其他的方式实现。例如在 Java 中就可以采用接口的方式实现,如图 10-2 所示。
在这里插入图片描述
图 10-2 中所描绘的类就应用了 Abstract Factory 的思想,采用面向接口的方式,简单实现了工厂模式。Product Factory 既可以看作抽象工厂 Abstract Factory,也可以看作具体的工厂(车间) Concrete Factory 。其中提供了一个获得产品的方法: getProduct(productName:String),该方法将根据产品的名称创建特定的产品,并返回。所有的产品都实现了 Product 接口,可以在客户程序中加以使用。同抽象工厂模式一样,工厂中获得对象的方法(getProduct())与实际的产品线数量是一致的,如果要增加新的产品线——例如定义新的产品接口 ProductX,需要增加相应的 getProduct()方法。由于这种方式把 Abstract Factory和 Concrete Factory 合并为一个 Product Factory,所以增加新的实现 Product 接口的 Productn 不需要修改任何代码。
除了这种面向接口的方法外,工厂模式还可以有更多的变化。前面已经说过,学习设计模式最终要的是学习设计思想,学习了工厂模式后,应该知道:
① 可配置的对象创建方法可以提高系统的移植性和复用性。
② 充分利用面向对象多态的特性可以避免对象创建过程的硬编码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值