Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 什么时候应该使用工厂模式?_Asp.net_Vb.net_Design Patterns_Factory Pattern - Fatal编程技术网

Asp.net 什么时候应该使用工厂模式?

Asp.net 什么时候应该使用工厂模式?,asp.net,vb.net,design-patterns,factory-pattern,Asp.net,Vb.net,Design Patterns,Factory Pattern,正如标题所问,你脑袋里的触发器什么时候会响,表示“啊哈!我应该在这里使用工厂模式!”?我发现很多其他设计模式都会出现这种情况,但我从不停下来思考这种模式。工厂在本地化中被大量使用,每个市场都有不同布局、提示和外观/感觉的屏幕。您可以让屏幕工厂根据您的语言创建一个屏幕,并根据其参数创建相应的子类。工厂模式最适合用于在方法中封装一组对象的实例化的情况 换句话说,如果您有一组对象,这些对象都继承自同一基类,或者都实现了相同的接口,那么这将是您希望使用factory模式的实例(这将是您要查找的“模式”)

正如标题所问,你脑袋里的触发器什么时候会响,表示“啊哈!我应该在这里使用工厂模式!”?我发现很多其他设计模式都会出现这种情况,但我从不停下来思考这种模式。

工厂在本地化中被大量使用,每个市场都有不同布局、提示和外观/感觉的屏幕。您可以让屏幕工厂根据您的语言创建一个屏幕,并根据其参数创建相应的子类。

工厂模式最适合用于在方法中封装一组对象的实例化的情况


换句话说,如果您有一组对象,这些对象都继承自同一基类,或者都实现了相同的接口,那么这将是您希望使用factory模式的实例(这将是您要查找的“模式”)。

我可以想到两种我认为factory模式的具体情况:

  • 当构造函数中有逻辑时
  • 当我不想让应用程序担心实例化了什么类型时(例如,我有一个抽象基类或返回的接口)
引自:

在以下情况下使用Factory方法模式:

  • 类不能预测它必须创建的对象类
  • 类希望其子类指定它创建的对象
  • 类将职责委托给几个助手子类中的一个,并且您希望本地化哪个助手子类是委托的知识

我强烈推荐GoF的书。它有一节介绍了它所涵盖的23种模式中的每种模式的适用性。

每当您发现自己的代码看起来像这样时,您可能应该使用工厂:

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

你说的是工厂方法还是抽象工厂

两者解决的基本问题是让客户端指定框架代码构造的确切类。例如,如果您提供了一个客户机可以实现的接口,那么在您的代码中有如下内容:

IMyInterface x = new ConcreteClass();
客户端无法更改在没有访问该代码的情况下创建的确切类

工厂方法是构造特定接口的具体类的虚拟方法。代码的客户端可以提供一个覆盖该方法的对象,以选择它们希望您创建的类。在您的代码中可能如下所示:

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的实现者决定,mazeFactory将实现您提供的接口(IMazeFactory)

因此,如果您提供的是期望其他人实现和提供的接口或抽象类,那么工厂也可以为您的代码提供一种方法,以便在您需要时构造它们的具体类。

我立即单击了“返回的抽象基类或接口”。谢谢