正如标题所要求的那样,你头脑中的触发器何时会消失,表示“啊哈!我应该在这里使用工厂模式!”?我发现这些时刻会出现在许多其他设计模式中,但我从不停下来思考这种模式。
答案 0 :(得分:4)
工厂模式最适用于要在方法中封装一组对象的实例化的情况。
换句话说,如果你有一组对象都是从同一个基类继承的,或者都是实现了同一个接口,那么你想要使用工厂模式的实例(那就是“模式”)你会寻找)。
答案 1 :(得分:4)
引自GoF:
时使用工厂方法模式
- 一个类无法预测它必须创建的对象类
- 一个类希望其子类指定它创建的对象
- 类将责任委托给几个辅助子类之一,并且您希望本地化知道哪个辅助子类是委托。
我强烈推荐GoF书。它有一节介绍它涵盖的23种模式中的每一种的适用性。
答案 2 :(得分:4)
每当你发现自己看起来像这样的代码时,你应该使用工厂:
IFoo obj;
if ( someCondition ) {
obj = new RegularFoo();
} else if ( otherCondition ) {
obj = new SpecialFoo();
} else {
obj = new DefaultFoo();
}
答案 3 :(得分:3)
我可以想到两个我认为工厂模式的具体案例:
答案 4 :(得分:1)
您在谈论工厂方法还是抽象工厂?
两者都解决的基本问题是让客户指定框架代码构造的确切类。例如,如果您提供了一个接口,客户端可以实现,然后在您的代码中有类似的内容:
IMyInterface x = new ConcreteClass();
客户端无法更改在不访问该代码的情况下创建的确切类。
Factory Method是一种构造特定接口的具体类的虚方法。代码的客户端可以提供一个覆盖该方法的对象,以选择他们希望您创建的类。它可能在您的代码中看起来像这样:
IMyInterface x = factory.Create();
factory
由客户端传入,并实现了一个包含Create()的接口 - 他们可以决定确切的类。
如果您具有相关对象的层次结构并且需要能够编写仅与基本接口对话的代码,则应使用抽象工厂。抽象工厂包含多个工厂方法,用于从每个层次结构中创建特定的具体对象。
在四人帮的设计模式一书中,他们举了一个有房间,墙壁和门的迷宫的例子。客户端代码可能如下所示:
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)。
因此,如果您提供接口或抽象类,您希望其他人实现和提供 - 那么工厂也是他们为您的代码提供了一种在您需要时构建其具体类的方法。
答案 5 :(得分:0)
工厂在本地化中经常使用,您可以在屏幕上看到每个市场的不同布局,提示和外观。您可以使用屏幕工厂根据您的语言创建一个屏幕,并根据其参数创建相应的子类。