正如标题所要求的,你脑袋里的触发器什么时候应该熄灭,意味着“啊!我应该在这里使用工厂模式!”?我发现这些时刻会与许多其他设计模式一起发生,但我从来不会停下来思考这种模式。什么时候应该使用工厂模式?
4
A
回答
4
工厂模式最适用于需要封装方法内一组对象实例的情况。
换句话说,如果你有一组对象都是从同一个基类继承的,或者全部实现了相同的接口,这个接口就是你想要使用工厂模式的实例(这就是“模式“你会寻找)。
0
工厂在本地化中使用很多,您可以在这里为每个市场提供不同布局,提示和外观/感觉的屏幕。您可以让Factory Factory根据您的语言创建一个屏幕,并根据其参数创建适当的子类。
3
我能想到的,我觉得工厂模式的两个具体情况:
- 当构造函数有逻辑在里面。
- 当我不希望应用程序担心什么类型被实例化(例如,我有一个抽象的基类或接口,我正在返回)。
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 )。因此,如果您提供的接口或抽象类,您期望其他人实现并提供 - 那么工厂也是他们提供一种方法让您的代码在您需要时构建具体类。
相关问题
- 1. 什么时候应该使用抽象工厂模式
- 2. 什么时候应该使用工厂方法模式? (而不是组合物)
- 3. 什么时候应该使用模板
- 4. 什么时候应该使用AWS,什么时候不使用
- 5. 什么时候应该使用Import-Package,什么时候应该使用Require-Bundle?
- 6. 什么时候应该使用构建器设计模式?
- 7. 什么是单身模式?为什么和什么时候应该使用它?
- 8. 什么时候应该使用工厂在Perl中封装构造函数?
- 9. 什么是模拟,什么时候应该使用它?
- 10. 什么时候应该使用datagrid,何时应该使用datagridview?
- 11. 什么时候应该使用$(object),何时应该使用$ object?
- 12. 什么时候应该使用getElementById?
- 13. 什么时候应该使用_aligned_malloc()?
- 14. 什么时候应该使用GC.SuppressFinalize()?
- 15. 什么时候应该使用`use`?
- 16. 什么时候应该使用didFinishLaunchingWithOptions?
- 17. 什么时候应该使用可可?
- 18. 什么时候应该使用RESTful?
- 19. 什么时候应该使用const?
- 20. 什么时候应该使用git add?
- 21. 什么时候应该使用html5 sessionStorage?
- 22. 我什么时候应该使用javax.swing.SwingUtilities.invokeLater()?
- 23. 什么时候应该使用Solandra
- 24. 什么时候应该使用*,&,。 , - >?
- 25. 什么时候应该使用$(document).ready?
- 26. 什么时候应该使用scala.util.DynamicVariable?
- 27. 什么时候应该使用流?
- 28. 我什么时候应该使用UITableViewCellSeparatorStyleSingleLineEtched?
- 29. 什么时候应该使用FSharpFunc.Adapt?
- 30. 什么时候应该使用@android:id /?
的“抽象基类或接口,我回来”,我点击的时候了。谢谢! – 2009-09-26 14:05:02