设计模式问答系列(2)----工厂模式

来源:互联网 发布:淘宝网店助理 编辑:程序博客网 时间:2024/05/19 02:04

你能解释工厂模式吗?

  • 工厂模式是创建类模式的一种。从它的名称可以看出,它是用来建造或者创造对象的。在软件体系范围内,工厂模式用来集中化创建对象。下面是一段客户端的代码,根据不同的发票类型来创建各种发票对象。代码存在如下两个问题:

  • 第一,代码中多处出现了new关键字。一大堆创建对象的活动会使得代码的逻辑非常复杂。
    第二个问题就是代码需要关心所有的发票类型。如果我们要添加一种有脚注的发票类型,我们就需要引入一个新的类并且重新编译代码。

图1:不同的发票类型

以这些问题为基础,我们来看看工厂模式如何帮助我们解决这些问题。下图展示了工厂模式的结构,其中有两个实现类:ClsInvoiceWithHeaderClsInvoiceWithOutHeader

图2:工厂模式

上面讲到的第一个问题是因为创建发票的代码直接和两个实现类相关联。通过引入工厂类ClsFactoryInvoice来执行所有的创建对象的工作,即可解决该问题。
第二个问题是因为客户端代码需要同时关心两个实现类ClsInvoiceWithHeaderClsInvoiceWithOutHeader。如果要添加新的发票类型,将导致代码需要重新编译。假设我们添加了一个新的实现类ClsInvoiceWithFooter,我们就需要相应地修改代码和重新编译代码。为了解决这个问题,我们引入了公共的接口IInvoice.ClsInvoiceWithHeaderClsInvoiceWithOutHeader都需要实现这个接口。
客户端代码只涉及到了IInvoice接口,而和两个实现类没有关联。这样现在我们添加一个发票类型,我们就不需要修改客户端的任何代码。

简单来说就是,ClsFactoryInvoice来负责创建对象,**IInvoice来负责接触客户端代码和实现类的关联。

下面的代码片段是用C#语言具体实现的工厂模式。为了避免重新编译客户端代码,我们引入了发票接口IInvoice。所有的实现类都会继承并实现这个接口。

图3:接口和实现类

同时我们引入了一个额外的类ClsFactoryInvoice。这个类中有一个方法getInvoice(),用来生成依赖于发票类型的对象。简单说,在ClsFactoryInvoice类中我们有了一个集中创建对象的逻辑。客户端代码通过调用getInvoice方法来生成发票类。其中要注意的很重要的一点是,客户端代码只引用IInvoice类型,工厂类ClsFactoryInvoice也会给出同样类型的引用。这样就可以帮助客户端代码和具体实现类完全解耦,在添加新的发票类型时不需要重新编译客户端代码。

图4:用于生成对象的工厂类


原文链接:http://www.codeproject.com/Articles/28309/Design-pattern-FAQ-Part-1-Training

0 0
原创粉丝点击