2009-06-22 72 views
4

正如标题所要求的,你脑袋里的触发器什么时候应该熄灭,意味着“啊!我应该在这里使用工厂模式!”?我发现这些时刻会与许多其他设计模式一起发生,但我从来不会停下来思考这种模式。什么时候应该使用工厂模式?

回答

4

工厂模式最适用于需要封装方法内一组对象实例的情况。

换句话说,如果你有一组对象都是从同一个基类继承的,或者全部实现了相同的接口,这个接口就是你想要使用工厂模式的实例(这就是“模式“你会寻找)。

0

工厂在本地化中使用很多,您可以在这里为每个市场提供不同布局,提示和外观/感觉的屏幕。您可以让Factory Factory根据您的语言创建一个屏幕,并根据其参数创建适当的子类。

3

我能想到的,我觉得工厂模式的两个具体情况:

  • 当构造函数有逻辑在里面。
  • 当我不希望应用程序担心什么类型被实例化(例如,我有一个抽象的基类或接口,我正在返回)。
+0

的“抽象基类或接口,我回来”,我点击的时候了。谢谢! – 2009-09-26 14:05:02

4

GoF报价:

使用时

  • 一类无法预料类对象的工厂方法模式,必须建立
  • 一类希望其子类指定它创建的对象
  • 类将责任委托给几个助手子类之一,并且您想要调整哪些助手子类是委托的知识。

我强烈推荐GoF书。它包含了它涵盖的23种模式中每一种的适用性部分。

4

当你发现自己的代码,看起来这样的事情,你也许应该使用工厂:

IFoo obj; 
if (someCondition) { 
    obj = new RegularFoo(); 
} else if (otherCondition) { 
    obj = new SpecialFoo(); 
} else { 
    obj = new DefaultFoo(); 
} 
1

你说的是工厂方法或抽象工厂?

两个解决的基本问题是让客户指定框架代码构造的确切类。例如,如果你提供一个接口,客户端可以实现,然后在你的代码有类似:

IMyInterface x = new ConcreteClass(); 

没有办法为客户更改在没有访问该代码创建的确切类。

工厂方法是一种构造特定接口的具体类的虚拟方法。您的代码的客户端可以提供一个覆盖该方法的对象来选择他们希望您创建的类。它看起来像这样在你的代码:

IMyInterface x = factory.Create(); 

factory由客户端传递,并实现包含创建一个接口() - 他们可以决定的确切类。

,如果您有相关的对象的层次,需要能够编写代码抽象工厂应该使用,只有谈判的基本接口。抽象工厂包含多个工厂方法,可以从每个层次结构创建特定的具体对象。

设计模式书的四人帮,他们举了一个与房间,墙壁和门迷宫的例子。客户端代码可能是这样的:

IRoom r = mazeFactory.CreateRoom(); 
IWall nw = mazeFactory.CreateWall(); 
IWall sw = mazeFactory.CreateWall(); 
IWall ew = mazeFactory.CreateWall(); 
IWall ww = mazeFactory.CreateWall(); 
r.AddNorthWall(nw); 
r.AddSouthWall(sw); 
r.AddEastWall(ew); 
r.AddWestWall(ww); 

(等)

确切的混凝土墙,房间,门可以通过mazeFactory的实现者,这将实现您提供的接口决定(IMazeFactory )。因此,如果您提供的接口或抽象类,您期望其他人实现并提供 - 那么工厂也是他们提供一种方法让您的代码在您需要时构建具体类。

相关问题