Factory Method模式

来源:互联网 发布:专利公司 知乎 编辑:程序博客网 时间:2024/06/08 19:11

1.意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

2.动机

框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。

考虑这样一个应用框架,它可以为用户预定多种物件。在这个框架中,两个主要的抽象类Application和Item。客户必须通过它们的子类来做与具体应用相关的实现。

例如,为了从该框架创建一个食物预定的应用(既然都是吃货,聊点吃的应该效果不错),我们定义类DinnerApplication和FoodItem。Application类负责管理Item并根据需要创建它们---例如,当用户从菜单中选择预览物件的时候。

因为被实例化的特定的Item子类是与特定应用相关的,所以Application类不可能预测到哪个Item子类将被实例化:Application类仅知道一个新的物件何时应被创建,而不知道哪种Item将被创建。那么问题来了,框架必须实例化类,但是它只知道不能被实例化的抽象类。

FactoryMethod模式提供了一个解决方案。它封装了哪一个Item子类将被创建的信息并将这些信息从该框架中分离出来,如下图所示。

Application的子类重写Application的抽象操作createItem以返回适当的Item子类对象。一旦一个Application子类实例化以后,它就可以实例化与应用相关的物件,而无需知道这些物件的类。我们称createItem是一个工厂方法,因为它负责“生产”一个对象。

3.适用性

在下列情况下可以使用Factory Method模式:

当一个类不知道它所必须创建的对象的类的时候。

当一个类希望由它的子类来指定它所创建的对象的时候。

当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个子类是代理者这一信息局部化的时候。

4.结构


5.效果

工厂方法不再将与特定应用相关的类绑定到你的代码中。代码仅处理Product接口。因此它可以与用户定义的任何ConcreteProduct类一起使用。

工厂方法的一个潜在缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建Creator的子类。

6.And One More Thing

为了不曲解大师的寓意,文章里的大多数用词、语境摘自GOF的《Design Patterns ---Elements of Reusable Object-Oriented Software》,你可以从此书中了解更详细的内容。

0 0
原创粉丝点击