使用web工厂方法的效果有哪些
本篇内容主要讲解"使用web工厂方法的效果有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"使用web工厂方法的效果有哪些"吧!
效果
工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理Product接口;因此它可以与用户定义的任何ConcreteProduct类一起使用。
编写可扩展代码经常做的一件事就是区分问题领域中共通的部分和该应用特定的部分并加以分离。特定部分最常见的入口就是创建对象的位置。工厂方法模式正好提供了一个可以将构建特定类的部分分离出来的方法。有了这个方法共通的部分只要面对Product接口编程即可,从结构上保证了共通代码可以和任何具象Product类一起工作。
工厂方法的一个潜在缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建Creator的子类。当Creator子类不必需时,客户现在必然要处理类演化的其他方面;但是当客户无论如何必须创建Creator的子类时,创建子类也是可行的。
A potential disadvantage of factory methods is that clients might have to subclass the Creator class just to create a particular ConcreteProduct object.Subclassing is fine when the client has to subclass the Creator class anyway, but otherwise the client now must deal with another point of evolution.
这一段的后半部分翻译不大好理解,和英文原文一起看。工厂方法使用Creator的子类创建ConcreteProduct对象。这是一个潜在的缺点。之所以说是潜在的是因为:如果这个Creator子类本来就是必须的,那么使用工厂方法并不会带来新的负担,一切都OK;否则的话,客户就必须处理演化的其他方面。这里《设计模式》的作者没说明其他方面具体指那些方面,作者猜想可能是指子类化Creator类所带来的负担吧。
下面是Factory Method模式的另外两种效果:
1 ) 为子类提供挂钩(hook)
用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。Factory Method给子类一个挂钩以提供对象的扩展版本。
在Document的例子中,Document类可以定义一个称为CreateFileDialog的工厂方法,该方法为打开一个已有的文档创建默认的文件对话框对象。 Document的子类可以重定义这个工厂方法以定义一个与特定应用相关的文件对话框。在这种情况下,工厂方法就不再抽象了而是提供了一个合理的缺省实现。
使用工厂方法在类内部创建对象有两个含义,首先是将创建对象的代码封装在一个成员函数中,然后是将这个函数声明为虚函数。这样就为派生类提供了选择扩展或者不扩展的灵活性。
2) 连接平行的类层次
迄今为止,在我们所考虑的例子中,工厂方法并不往往只是被Creator调用,客户可以找到一些有用的工厂方法,尤其在平行类层次的情况下。
构建ConcreteProduct的代码可以被Creator自己使用,有时也会被其他客户使用。特别是在平行类层次的结构中。
当一个类将它的一些职责委托给一个独立的类的时候,就产生了平行类层次。
这句话不大好理解,别着急接着看下面的例子。
考虑可以被交互操纵的图形;也就是说,它们可以用鼠标进行伸展、移动,或者旋转。
我们可以将图形的伸展,移动或者旋转看作图形类的一部分职责。
实现这样一些交互并不总是那么容易,它通常需要存储和更新在给定时刻记录操纵状态的信息,这个状态仅仅在操纵时需要。因此它不需要被保存在图形对象中。
上述交互操作的实现有一定难度,而且通常需要存储操作的状态。如果真的在各个图形类的内部实现会占据很大的篇幅。同时这些信息只是在操作是才需要,并不是各个图形类本质的部分。《设计模式》作者希望表的的应该是:将相互操作这部分职责委托出去的需求是确实存在的。
此外,当用户操纵图形时,不同的图形有不同的行为。例如,将直线图形拉长可能会产生一个端点被移动的效果,而伸展正文图形则可能会改变行距。
不同的图形对于伸展,移动或旋转的处理经常会不同。这里说的是对于不同的图形需要不同的处理类。
有了这些限制,最好使用一个独立的Manipulator对象实现交互并保存所需要的任何与特定操纵相关的状态。不同的图形将使用不同的Manipulator子类来处理特定的交互。得到的Manipulator类层次与Figure类层次是平行(至少部分平行),如下图所示。
这种图形类和Manipulaotr类之间的关系就是平行类。在这个例子中图形类将控制图形伸展,移动,旋转的这部分职责委托给了Manipulator类。
Figure类提供了一个CreateManipulator工厂方法,它使得客户可以创建一个与 Figure相对应的Manipulator。Figure子类重定义该方法以返回一个合适的Manipulator子类实例。做为一种选择,Figure类可以实现CreateManipulator以返回一个默认的Manipulator实例,而Figure子类可以只是继承这个缺省实现。这样的Figure类不需要相应的Manipulator子类 - 因此该层次只是部分平行的。注意工厂方法是怎样定义两个类层次之间的连接的。它将哪些类应一同工作工作的信息局部化了。
在这个例子中,通过Figure提供的CreateManipulator工厂方法建立了Figure类和Manipulator类之间的联系。
类似的,我们也可以为Figure类设计CreateSetupDialog工厂方法以建立Figure类和每种图形的设定画面之间的联系。
到此,相信大家对"使用web工厂方法的效果有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!