首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java中的工厂模式

java中的工厂模式
EN

Stack Overflow用户
提问于 2009-06-22 10:31:21
回答 5查看 5.7K关注 0票数 6

我使用的是据称使用Factory模式的java代码,但我并不完全相信这种模式。

我的代码是这样的:

代码语言:javascript
运行
复制
// the factory
class SomeFactoryImpl {
   Set<SomeClass> getSomeListOfObjects();
}

在代码中的某个地方:

代码语言:javascript
运行
复制
{ ...
    SomeFactory factory = new SomeFactoryImpl();
    Set<SomeClass> list = factory.getSomeListOfObjects();
}

我考虑的要点是,如果工厂类没有静态create()方法,那么就需要实例化一个工厂,而IMO应该和实例化对象本身一样复杂。

我不认为这样的工厂可以返回要生成的对象集合的论点是足够好的。我觉得如果在实际从工厂创建对象之前需要创建一个工厂实例,那么可以有更干净的解决方案。

我觉得如果创建方法是工厂类的静态方法,情况会更好。但我也确信,我的观点并不完全“正确”。

那么,So社区能给出一些示例,说明实例化Factory对象比使用静态创建方法更好吗?

另外,我遇到了一个类似的问题的答案,这个问题列出了这些链接和答案:所以我需要通过代码示例清楚地知道FactoryMethodPatternFactoryMethodCreationMethod之间的区别。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-22 11:31:15

使用工厂的实例将显示与依赖注入相结合的真正好处。

因此,在您的示例中,而不是:

代码语言:javascript
运行
复制
{ ...
    SomeFactory factory = new SomeFactoryImpl();
    Set<SomeClass> list = factory.getSomeListOfObjects();
}

你可能会:

代码语言:javascript
运行
复制
public ThisClass(SomeFactory someFactory) {
    this.factory = someFactory;
}   

然后以后..。

代码语言:javascript
运行
复制
{ ...
    Set<SomeClass> list = factory.getSomeListOfObjects();
}

以下几点:

  • 在这种情况下,您的类没有对具体工厂的任何引用,并且不需要了解SomeFactoryImpl,它只知道抽象的SomeFactory。
  • 在这种情况下,正在传递的工厂实例可以在实例的基础上配置,而不是静态的,这在我看来是一种更好的处理方法。如果您可以使工厂实例不可变,那么您就可以真正减少多线程的担忧。
  • 使用静态调用为您提供一个实例并不是更好,对创建实例的类的引用仍然是一个具体的实现细节,只是更高一些--尽管这可能会使其足够高来解决您的问题。

我知道这只是你问题的一个子集..。

票数 5
EN

Stack Overflow用户

发布于 2009-06-22 10:39:46

我想,对象创建的静态方法是最流行的方法,但也有一些用例--首先创建工厂实例是有意义的。例如,如果您想将它与注册表结合起来(其中应该允许多个注册中心共存)。

此外,如果工厂依赖某些动态上下文信息(数据库连接,.)在我看来,最好让工厂实例来处理这件事。

票数 1
EN

Stack Overflow用户

发布于 2009-06-22 10:51:02

首先,你忘记了工厂模式的主要目的,我打开了“四人帮”的书,它说:

“定义用于创建objet的接口,但让子类决定要实例化哪个类。工厂方法允许类将实例化推迟到子类。”

这意味着您实际上定义了一个接口,因此SomeFactoryImpl应该实现在其他地方定义的接口。当您有许多需要实例化的对象,但您不想关心它们是哪种对象时,这是有用的。例如,我使用它们来开发一个远程swing应用程序,在这个应用程序中,客户端通过序列化下载了客户机VM中不存在的一些类的定义。每个类都定义了一个特定视图的JPanel子类,但是当到达客户端时,我不得不在不知道这些类的情况下找到一种方法来对这些类进行定位,所以我使用了一个工厂模式来调用工厂类,并让它实例化我的u为人对象(而且是扩展了由我定义的JPanel子类)。另一个例子是生成适合您需要的特定于案例的对象。例如(如与此设计模式相关的wikipedia页面中所述),您可以认为一个工厂构建对象,然后为同一类型对象构建另一个工厂,但用于生成“假对象”,这将导致某种单元测试失败。

但是,您也可以使用静态方法解决您的特定问题,但是可以考虑将从在大型项目中使用它们的部件中生成项的部分拆分。当然,开发客户端部件的人应该知道使用的是哪个工厂接口,并且只需要知道这一点就可以使用其他部分中定义的所有对象。

Creation是一种“方便”模式,只用于定义构造函数的自定义版本,而不用担心使用标准定义(方法的名称与类的名称相同),但它没有什么特殊之处。只是另一种方式来识别物体..。创建模式实际上并没有解决任何特定的问题(不包括具有相同数量和类型参数的构造函数)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1026463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档